git pull而不在git目录中

Gav*_*egg 292 git

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

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

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

Von*_*onC 427

启动git 1.8.5(2013年第4季度),您将能够"使用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

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

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

  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月),并提交6a536e2通过KARTHIK纳亚克(KarthikNayak),git将把" git -C '<path>'"作为一个在无操作<path>是空的.

' git -C ""'无益地死于错误" Cannot change to ''",而shell将cd""视为无操作.
以壳的行为为先例,教导git将-C""作为无操作处理.

  • @JanGalinski但我确实提到了"启动git 1.8.5".所以git 1.8.3.x还不知道该选项. (7认同)
  • 喔,不错!这样更优雅,所以我会将它标记为未来的观众. (5认同)
  • 在Ubuntu 12.04上,我不得不安装一个新的git版本.我是这样做的:`apt-get install software-properties-common python-software-properties`然后添加git repo`add-apt-repository ppa:git-core/ppa`.最后一步是更新git:`apt-get update && apt-get upgrade`. (2认同)

bst*_*rre 54

编辑:

有一个错误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
Run Code Online (Sandbox Code Playgroud)

原始答案:

假设你正在运行bash或类似的,你可以这样做(cd /X/Y; git pull).

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.
Run Code Online (Sandbox Code Playgroud)

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

GIT_DIR=/tmp/ggg2/.git git pull
Run Code Online (Sandbox Code Playgroud)

另请参阅这个回答类似问题的答案,该问题演示了--git-dir--work-tree标志.


tak*_*hin 29

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

cd /X/Y && git pull && cd -
Run Code Online (Sandbox Code Playgroud)


sam*_*ler 29

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

git --work-tree=/X/Y --git-dir=/X/Y/.git pull origin branch
Run Code Online (Sandbox Code Playgroud)

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


Iva*_*anD 7

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

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

pushd /X/Y
git pull
popd
Run Code Online (Sandbox Code Playgroud)

或者,做一个单行:

pushd /X/Y; git pull; popd
Run Code Online (Sandbox Code Playgroud)

Linux和Windows都有pushd和popd命令.


Ram*_*asi 5

使用组合pushd,git pullpopd,我们可以实现这个功能:

pushd <path-to-git-repo> && git pull && popd
Run Code Online (Sandbox Code Playgroud)

例如:

pushd "E:\Fake Directory\gitrepo" && git pull && popd
Run Code Online (Sandbox Code Playgroud)