git pull而不在git目录中

时间:2011-02-22 19:58:57

标签: git

假设我有一个目录/X/Y,它是一个git存储库。是否有可能以某种方式从git pull内部调用/X之类的命令,但是以/X/Y目录为目标?

编辑:我想我特意想知道:是否可以使用git命令执行此操作,但无需更改目录?

注意:我已接受VonC's answer,因为它比以前的选项更优雅。对于运行Git低于1.8.5的用户,请参阅bstpierre's answer below

9 个答案:

答案 0 :(得分:400)

启动git 1.8.5 (Q4 2013),您将能够“使用Git命令,但无需更改目录”。

  

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

通过 commit 44e1e4

查看Nazri Ramliy
  

在不离开当前目录的情况下,在不同目录中调用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.   
  3. (cd ../..; git grep foo)
  4.   
  5. for d in d1 d2 d3; do (cd $d && git svn rebase); done
  6.         

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

         

    使用这个新选项,可以用更少的击键来完成上述操作:

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

自Git 2。3。4(2015年3月)以及commit 6a536e2 Karthik Nayak (KarthikNayak)后,git会将“git -C '<path>'”视为{strong> no-op { {1}}为空。

  

'<path>'无效地死于错误“git -C ""”,而shell将cd“”视为无操作。
  将shell的行为作为先例,教导Cannot change to ''将-C“”作为无操作处理。

答案 1 :(得分:52)

修改

git pull存在错误,或者您无法执行该命令要执行的操作。但可以,使用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 pull)

git man page指定了一些似乎应该有帮助的变量(参见“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更新该repo时运行以下命令,但更新的文件出现在/ tmp而不是工作树/ tmp / ggg2:

GIT_DIR=/tmp/ggg2/.git git pull

另请参阅this answer to a similar question,其中演示了--git-dir--work-tree标记。

答案 2 :(得分:29)

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

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

答案 3 :(得分:27)

这篇文章有点旧,所以可能有一个bug而且已修复,但我刚刚这样做了:

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

它有效。我花了一分钟才发现它想要dotfile和父目录(在标准设置中,它们总是父/子,但不是在所有设置中,因此需要明确指定它们。

答案 4 :(得分:7)

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

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

pushd /X/Y
git pull
popd

或者,作为一个单行使用:

pushd /X/Y; git pull; popd

Linux和Windows都有pushd和popd命令。

答案 5 :(得分:4)

您可以编写如下脚本:

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

答案 6 :(得分:2)

对于像我这样试图通过远程服务器上的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

答案 7 :(得分:2)

使用组合pushdgit pullpopd,我们可以实现以下功能:

pushd <path-to-git-repo> && git pull && popd

例如:

pushd "E:\Fake Directory\gitrepo" && git pull && popd

答案 8 :(得分:1)

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

在一行

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

或通过SSH。

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