Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不在git目录中时进行git拉取_Git - Fatal编程技术网

不在git目录中时进行git拉取

不在git目录中时进行git拉取,git,Git,假设我有一个目录,/X/Y,它是一个git存储库。是否可以从/X内部调用类似于git pull的命令,但目标是/X/Y目录 编辑:我想我特别想知道的是:是否可以使用git命令执行此操作,但不必更改目录 注意:我接受了,因为它比以前的选项优雅得多。对于运行早于1.8.5的Git的用户,请参见。您可以将其包装在bash脚本或Git别名中: cd/X/Y&&git-pull&&cd- 您可以编写如下脚本: cd/X/Y 吉特拉力 您可以将其命名为gitpull 如果您希望它执行任意目录而不是/X/Y

假设我有一个目录,
/X/Y
,它是一个git存储库。是否可以从
/X
内部调用类似于
git pull
的命令,但目标是
/X/Y
目录

编辑:我想我特别想知道的是:是否可以使用git命令执行此操作,但不必更改目录


注意:我接受了,因为它比以前的选项优雅得多。对于运行早于1.8.5的Git的用户,请参见。

您可以将其包装在bash脚本或Git别名中:

cd/X/Y&&git-pull&&cd-

您可以编写如下脚本:

cd/X/Y
吉特拉力
您可以将其命名为
gitpull

如果您希望它执行任意目录而不是
/X/Y

cd$1
吉特拉力
然后你可以用gitpull/X/Z调用它 最后,您可以尝试查找存储库。我有一个
~/git
文件夹,其中包含存储库,您可以使用它对所有存储库进行拉取

g=`find/X-name.git`
以${g[@]}为单位的回购
做
cd${repo}
光盘
吉特拉力
完成
编辑

git pull有一个bug,或者你不能用这个命令做你想做的事情。但是,您可以使用“获取”和“合并”来执行此操作:

cd /X
git --git-dir=/X/Y/.git fetch
git --git-dir=/X/Y/.git --work-tree=/X/Y merge origin/master
原始答案

假设您正在运行bash或类似的程序,您可以执行
(cd/X/Y;git-pull)

指定了一些变量(请参阅“git存储库”),这些变量似乎应该有所帮助,但我无法使它们正常工作(我的存储库位于/tmp/ggg2中):

在my cwd为/tmp时运行以下命令将更新该repo,但更新的文件将显示在/tmp中,而不是工作树/tmp/ggg2中:

GIT_WORK_TREE=/tmp/ggg2 GIT_DIR=/tmp/ggg2/.git git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.
GIT_DIR=/tmp/ggg2/.git git pull

另请参见,它演示了
--git dir
--work tree
标志。

对于像我这样试图通过远程服务器上的drush(Drupal shell)命令执行此操作的人,您将无法使用需要将CD插入工作目录的解决方案:

相反,您需要使用将拉动分解为获取和合并的解决方案:

drush @remote exec git --git-dir=/REPO/PATH --work-tree=/REPO/WORKDIR-PATH fetch origin
drush @remote exec git --git-dir=/REPO/PATH --work-tree=/REPO/WORKDIR-PATH merge origin/branch

这篇文章有点旧,所以可能是有一个bug,它已经被修复,但我只是这样做了:

git --work-tree=/X/Y --git-dir=/X/Y/.git pull origin branch

它成功了。我花了一分钟的时间才弄明白它想要的是点文件和父目录(在标准设置中,它们始终是父/子目录,但不是在所有设置中,因此它们需要明确指定。

这可能是一个类似的问题,但您也可以简单地链接命令。例如

一行

cd ~/Sites/yourdir/web;git pull origin master
或者通过SSH

ssh username@atyourserver.com -t "cd ~/Sites/thedir/web;git pull origin master"
开始时,您将能够“使用Git命令,但无需更改目录”

就像“
make-C
”,
git-C…
”告诉git在做其他事情之前先去那里

请参见

在不离开当前目录的情况下,需要更多的按键才能在不同的目录中调用Git命令:

  • (cd~/foo&&git状态)
    git--git dir=~/foo/.git--work tree=~/foo status
    GIT\u DIR=~/foo/.GIT GIT\u WORK\u TREE=~/foo GIT status
  • (cd./;git grep foo)
  • 用于d1 d2 d3中的d;do(cd$d和git svn rebase);完成
  • 上面显示的方法对于脚本来说是可以接受的,但是对于快速的命令行调用来说太麻烦了

    使用此新选项,只需较少的按键即可完成上述操作:

  • git-C~/foo状态
  • git-C../.grep foo
  • 对于d1 d2 d3中的d;执行git-C$d svn重新基;完成

  • 自Git 2.3.4(2015年3月)起,到,
    Git
    将在
    为空时将“
    Git-C”
    ”视为无操作。

    git-C”“
    ”将因错误而无效死亡“
    无法更改为“”
    ”,而shell将cd“”视为禁止操作。
    以shell的行为为例,教导git也将-C“”视为no-op


    4年后,Git2.23(2019年第3季度)记录了“
    Git-C”
    ”的工作原理,并且不会更改目录

    自从6a536e2(
    git
    :treat“
    git-C”
    ”以来,它的行为一直如此 当
    为空时为无操作,2015-03-06,Git v2.3.4)

    这意味着现在(最后)包括:

    如果“
    ”存在但为空,例如
    -C”“
    ,则当前工作目录保持不变


    例如,您可以看到与Git2.26(2020年第1季度)一起使用的
    git-C

    参见,,,,,,,(2019年12月20日)作者。
    (于2020年2月5日合并)

    :inline
    全名()
    签字人:刘丹东

    以前,我们运行的是
    test\u must\u fail full\u name
    。但是,
    test\u must\u fail
    只能用于git命令。
    内联
    full\u name()
    以便我们可以直接在
    git
    命令上使用
    test\u must\u fail

    当在中引入
    full_name()
    时(“引入
    @{upstream}
    符号”,2009-09-10,Git v1.7.0-rc0--),
    Git-C
    选项还不可用(因为它是在中引入的(
    Git
    :在给定了-C选项的目录中运行),2013-09-09,Git v1.8.5-rc0--中列出的)。
    因此,helper函数消除了每次手动
    cd
    的需要。但是,由于现在可以使用
    git-C
    ,我们只需使用它并内联
    full\u name()


    由于我的一些服务器使用的是旧的Ubuntu LTS版本,我无法轻松地将git升级到最新版本(如一些答案中所述,它支持-C选项)

    这个技巧对我很有效,特别是因为它没有其他answe的副作用
    pushd /X/Y
    git pull
    popd
    
    pushd /X/Y; git pull; popd
    
    pushd <path-to-git-repo> && git pull && popd
    
    pushd "E:\Fake Directory\gitrepo" && git pull && popd