不在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