git --git-dirが期待どおりに機能しない


209

現在とは別のディレクトリからgitを実行しようとしています。たとえば、次の場所にいる場合:

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
現在、ステータスは完璧に機能していますが、プルはエラーを出します。つまりroot @ erx [/]#git --git-dir = / home / domain / .git --work-tree = / home / domain / pull origin master fatal:/ usr / local / libexec / git-core / git -pullは作業ツリーなしでは使用できません。しかし、ステータスは機能しますか?どんなアイデアもジョン
リー

4
これは現在のgitの最大のバグです。--work-treeや--git-dirパラメータを尊重しない。
アダムDymitruk

5
git 1.8.5以降では、設定しないこと--git-dir--work-tree簡単なコマンドの選択肢があります。以下の私の回答を
VonC '21

回答:


314

作業ディレクトリも定義する必要があります。わかりにくいですが、柔軟性です。

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

ここでもう少し読むことができます


3
これはうまくいきました!これは紛らわしいことに同意しました。その呼ばれるそれは単純な愚かさを維持します。ほとんどの場合、柔軟性を確保しながら、VSが最も意味のあるデフォルトを与え、VSがコマンドをまったく機能しないようにすることができます。
いや

3
@Nickは同意しました。--git-dir指定されていない場合は、/mycode/.git存在するかどうかを確認し、エラーをスローする前にそれを使用します。
GP89

4
@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
Jamie Cook

1
すべてのコマンドが作業ツリーを必要とするわけではないことに注意してください。たとえば、「git --git-dir = / mycode / .git log」は正常に機能します。しかし、これが混乱することに同意しました!
ヨーヨー2013年

4
明確化: git --git-dir="$HOME/foo/.git" --work-tree="$HOME/foo" status
Haris Krajina

136

開始gitの1.8.5(来週アウトする必要があります)、それがさらに簡単になります。

 git -C "/home/domain/" status

もう設定する必要は--git-dirあり--work-treeません!


参照してください44e1e4コミットによってナズリ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

4
gitコマンドの後に -Cフラグを使用しようとトリップしました(たとえば、機能しgit status -C <path>ません!)
Kedar Paranjape

42

上記のコメントに基づいて、まだ問題が発生しているようです:

root @ erx [/]#git --git-dir = / home / domain / .git --work-tree = / home / domain / pull origin master
致命的:/ usr / local / libexec / git-core / git-pullは作業ツリーなしでは使用できません

これをcrontab何かから実行するつもりのようです。あなたは使ったほうが良いかもしれcd最初の作業ディレクトリに切り替えます。例えば:

root @ erx [/]#(cd / home / domain && git pull origin master)

これにより、一時的に(括弧内のサブシェルで)現在のディレクトリがに変更され/home/domain、が実行されgit pull origin masterます。コマンドが完了すると、現在のディレクトリはコマンドの前の状態のままになります。


サブシェルの使用はシンプルでエレガントです。なぜそのことを考えなかったのか、私にはわかりません!
Ehtesh Choudhury、2012

申し訳ありません@グレッグは、それは質問が尋ねた答えとしてジョンによって他の答えを投票-私はあなたが()■すなわち意思とあなたの洞察力をスポッティングと答えると上のスポットだと思い、私は10探していたまさにです
ダレンビショップ

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

Git 2.26(2020年第1四半期)では、ドキュメントがより明確になりました。

GIT_DIR(環境変数または " git --git-dir=<where> cmd"オプションを使用して)の場所を指定することの1つの効果は、リポジトリー検出無効にすることです

新しいユーザーはしばしば混乱するので、これはドキュメントにもう少しストレスを加えました。

Heba Waly(HebaWalyによるコミットd82ad54(2020年1月30日)を参照してください。
(合併によりJunio C浜野- gitster-17e4a1bをコミットする、2020年2月12日)

git:--git-dirのドキュメントを更新

署名者:Heba Waly
支援者:Junio C Hamano

git --git-dir <path> 少しわかりにくく、ユーザーが期待するように機能しない場合があります。

たとえば、ユーザーがを実行するとgit --git-dir=<path> status、gitはリポジトリ検出アルゴリズムをスキップし、特に指定されていない限り、ユーザーの現在の作業ディレクトリに作業ツリーを割り当てます。
この割り当てが間違っていると、出力はユーザーの期待と一致しません。

このパッチは、ドキュメントを更新してより明確にします。

したがって、今のドキュメントにgit --git-dirは次のものが含まれます。

--git-dir=<path>:

リポジトリ( " .git"ディレクトリ)へのパスを設定します。
これは、GIT_DIR環境変数を設定して制御することもできます。
現在の作業ディレクトリへの絶対パスまたは相対パスを指定できます。

.gitこのオプション(またはGIT_DIR環境変数)を使用して「」ディレクトリの場所を指定すると、「.git」サブディレクトリ(リポジトリと作業ツリーの最上位が検出される方法)を持つディレクトリを検索するリポジトリ検索がオフになります。作業ツリーの最上位にいることをGitに伝えます。

作業ツリーの最上位ディレクトリにいない場合は、--work-tree=<path>オプション(またはGIT_WORK_TREE環境変数)を使用して、作業ツリーの最上位の場所をGitに伝える必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.