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

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

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


当前回答

编辑:

要么git pull有bug,要么你不能用这个命令做你想做的事情。然而,你可以通过fetch和merge来实现:

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拉)。

git手册页指定了一些变量(参见“git存储库”),看起来它们应该有帮助,但我不能让它们正常工作(与我的存储库在/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时,运行以下命令更新该repo,但更新后的文件出现在/tmp中,而不是工作树/tmp/ggg2中:

GIT_DIR=/tmp/ggg2/.git git pull

另请参阅对类似问题的回答,其中演示了——git-dir和——work-tree标志。

其他回答

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

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

你可以这样写一个脚本:

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

编辑:

要么git pull有bug,要么你不能用这个命令做你想做的事情。然而,你可以通过fetch和merge来实现:

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拉)。

git手册页指定了一些变量(参见“git存储库”),看起来它们应该有帮助,但我不能让它们正常工作(与我的存储库在/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时,运行以下命令更新该repo,但更新后的文件出现在/tmp中,而不是工作树/tmp/ggg2中:

GIT_DIR=/tmp/ggg2/.git git pull

另请参阅对类似问题的回答,其中演示了——git-dir和——work-tree标志。

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

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

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

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

在一行上

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

或者通过SSH。

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