2009-09-06 155 views
176

我試圖從不同的目錄運行git比我在所以舉例來說,如果我在:混帳--git-dir的工作不正常

cd /home/domain/ 
git status << runs perfect ie 
# On branch master 
# Your branch is ahead of 'origin/master' by 6 commits. 

所以現在我想運行此使用--git-dir選項從不同目錄中執行命令。

因此,可以說我在root/,並嘗試這個辦法:

git --git-dir="/home/domain/" status 
## Error 
fatal: Not a git repository: '/home/domain/' 

我也試着包括.git文件夾即

git --git-dir="/home/domain/.git/" status 

但是,這看起來像它試圖運行git從根目錄,即刪除我的域名文件夾中的所有內容,並添加一切根。

希望有人可以告訴我做錯了什麼。

+4

現在我的狀態工作完美,但拉所賜錯誤。致命的:/ usr/local/libexec// home/domain/.git -work-dir =/home/domain/.git --work-tree = 致命:/ usr/local/libexec /沒有工作樹的情況下,不能使用git-core/git-pull。 但地位的作品? 任何想法喬恩 – Lee 2009-09-06 18:51:39

+4

這是git現在最大的bug。不尊重--work-tree和/或--git-dir參數。 – 2011-06-24 23:27:07

+3

從git 1.8.5開始,你可以選擇* not *設置'--git-dir'和'--work-tree'作爲一個簡單的命令:參見[我的答案](http:// stackoverflow。 com/a/20115678/6309) – VonC 2013-11-21 08:20:19

回答

258

您還必須定義工作目錄。令人困惑的是我知道,但這是一個靈活的事情。

git --git-dir=/mycode/.git --work-tree=/mycode status 

你可以讀到更多一點here

+2

感謝這工作!同意這是令人困惑的。它叫做Keep It Simple Stupid。你幾乎總是可以允許靈活性,同時給出默認值,讓最有意義的VS有一個命令根本不起作用。 – Nay 2012-01-18 06:34:30

+3

@Nick同意了,你會認爲如果沒有指定' - git-dir',它會檢查是否存在'/ mycode/.git'並在拋出錯誤之前使用它。 – GP89 2012-11-20 15:58:25

+3

@NickYeates借調!另外我在使用〜引用我的主目錄時遇到了問題,例如'git --git-dir =〜/ src/s3cmd/.git --work-tree =〜/ src/s3cmd pull'不起作用但是'git --git-dir =/home/username/src/s3cmd/.git --work-tree =/home/username/src/s3cmd pull' did – 2013-02-12 03:16:32

38

基於以上的評論,這聽起來像你還是遇到了一個問題:

 
[email protected] [/]# git --git-dir=/home/domain/.git --work-tree=/home/domain/ pull origin master 
fatal: /usr/local/libexec/git-core/git-pull cannot be used without a working tree 

這聽起來像你可能會打算從crontab運行這個東西。您最好使用cd先切換到您的工作目錄。例如:

 
[email protected] [/]# (cd /home/domain && git pull origin master) 

這將暫時(在子shell,這就是在括號做)改變當前目錄/home/domain,然後運行git pull origin master。命令完成後,當前目錄仍然保留在命令之前的任何目錄。

+0

使用子殼簡單而優雅。我不知道爲什麼我沒有想到過! – 2012-05-14 18:09:53

+0

對不起@Greg,Jon在回答問題時投了其他答案 - 但我認爲你發現並回答了意圖和你的洞察力,即()s正是我正在尋找的+10 – 2012-05-31 10:25:56

96

開始git 1.8.5(這應該是下週),這將是更簡單:

git -C "/home/domain/" status 

無需設置--git-dir--work-tree了!


commit 44e1e4通過Nazri Ramliy

它需要更多的按鍵在不同的目錄來調用git的命令,而無需離開當前目錄:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-dir=~/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