假设我有一个目录/X/Y,这是一个git存储库。是否有可能以某种方式调用命令,比如git从/X内部拉,但目标是/X/Y目录?

编辑:我想我特别想知道:是否有可能使用一个git命令来做到这一点,但不必改变目录?

注意:我接受了VonC的答案,因为它比以前的选项更优雅。对于运行1.8.5以上版本的Git的用户,请参阅下面bstpierre的回答。


当前回答

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

这个技巧对我来说很有效,尤其是因为它没有其他答案的副作用,这些答案会让你进入与你开始的目录不同的目录。

pushd /X/Y
git pull
popd

或者,把它写成一行代码:

pushd /X/Y; git pull; popd

Linux和Windows都有pushd和popd命令。

其他回答

对于像我这样试图在远程服务器上通过drush (Drupal shell)命令来做到这一点的人来说,你将无法使用需要你CD到工作目录的解决方案:

相反,你需要使用将pull分解为fetch & merge的解决方案:

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

这招奏效了。我花了一分钟才弄清楚它想要的是dotfile和父目录(在标准设置中,这些总是父/子目录,但不是在ALL设置中,所以它们需要显式指定。

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

这个技巧对我来说很有效,尤其是因为它没有其他答案的副作用,这些答案会让你进入与你开始的目录不同的目录。

pushd /X/Y
git pull
popd

或者,把它写成一行代码:

pushd /X/Y; git pull; popd

Linux和Windows都有pushd和popd命令。

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

在一行上

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

或者通过SSH。

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

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

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