git拉,而不是在一个git目录

比方说,我有一个目录, /X/Y ,这是一个Git仓库。 是否有可能以某种方式调用一个命令像从/X内的git pull ,但目标是/X/Y目录?

编辑:我想我特别想知道:是否有可能使用git命令,但不必更改目录?

注意:我已经接受了VonC的答案,因为它比以前的选项更加优雅。 对于运行Git超过1.8.5的人,请参阅下面的bstpierre的答案 。

启动git 1.8.5(2013年第四季度) ,你将能够“使用Git命令,但不必改变目录”。

就像“ make -C <directory> ”, git -C <directory> ... ”告诉Git在做其他事情之前先去那里

Nazri Ramliy的 提交 44e1e4

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

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-tree=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

上面显示的方法对于脚本来说是可以接受的,但是对于快速的命令行调用来说太麻烦了。

有了这个新的选项,上面的操作可以用更less的击键来完成:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done

自从Git 2.3.4(2015年3月)和Karthik Nayak( KarthikNayak ) 提交6a536e2之后 , <path>为空时git将把“ git -C '<path>' ”视为no-op。

' git -C "" '无用地死于错误“ Cannot change to '' “,而shell将cd”“视为无操作。
以shell的行为为先例,教git把C作为一个no-op。

编辑

有一个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手册页指定了一些看起来应该帮助的variables(请参阅“git Repository”),但是我无法使它们正常工作(使用/ 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. 

运行下面的命令,而我的cwd是/ tmp更新回购,但更新的文件出现在/ tmp而不是工作树/ tmp / ggg2:

 GIT_DIR=/tmp/ggg2/.git git pull 

另请参见对类似问题的回答,该问题演示了--git-dir--work-tree标志。

你可以把它包装在一个bash脚本或git别名中:

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

这个post有点老了,所以可能有一个错误,并修复了,但我只是这样做:

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

它的工作。 花了我一分钟的时间来找出它想要的dotfile和父目录(在标准设置这些总是父/子,但不是在所有的设置,所以他们需要明确指定。

由于我的一些服务器在Ubuntu LTS版本上,我不能轻易将git升级到最新版本(它支持一些答案中所述的-C选项)。

这个技巧对我来说很好,特别是因为它没有其他一些答案的副作用,让你在不同于你开始的目录中。

 pushd /X/Y git pull popd 

或者,把它作为一个单行的:

 pushd /X/Y; git pull; popd 

Linux和Windows都有pushd和popd命令。

你可以写这样的脚本:

 cd /X/Y git pull 

你可以把它命名为gitpull
如果你想让它做任意目录而不是/X/Y

 cd $1 git pull 

然后你可以用gitpull /X/Z来调用它
最后,您可以尝试查找存储库。 我有一个包含仓库的~/git文件夹,你可以用它来完成所有这些工作。

 g=`find /X -name .git` for repo in ${g[@]} do cd ${repo} cd .. git pull done 

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

相反,您需要使用解决scheme,将拉取分为一个取&合并:

 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 

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

在一条线上

 cd ~/Sites/yourdir/web;git pull origin master 

或通过SSH。

 ssh username@atyourserver.com -t "cd ~/Sites/thedir/web;git pull origin master"