2012-03-16 13 views
6

私はgitで独特な動作を見つけました。私はいつも自分のマシンでそれを再現することができます。`git --git-dir/path/to/git pull/path/to/other/bare-git master`は、作業ツリーを自動的に更新しません。何故なの?

私は2つのローカルリポジトリを持っている場合は、同じ親フォルダ内の両方のフォルダexpress.git、およびフォルダの急行内の作業ツリーと他の非裸、内部の裸の1が、私はexpress内部からのコマンドgit pull ../express.gitを行うことができますフォルダ。これにより、express内のすべてが自動的に更新されます。

しかし、いずれかのgitリポジトリにある場所からコマンドgit --git-dir /home/cisw470p/stu006/express/.git pull /home/cisw470p/stu006/express.git masterを実行すると、expressリポジトリに変更が反映されますが、作業ツリーは自動的に更新されません。私はgit add .を実行してすべての変更を追加してからexpressの中からもう1つのコミットをしなければならない。

--git-dirオプションを使用するコマンドの長いバージョンが、expressの作業ツリーを自動的に更新しないのはなぜですか?これには理由があるのですか?またはバグを見つけましたか?

編集:もう一度試してみましたが、別のファイルを編集していました。私は完全に失われています。

+0

gitは長い形式の作業ツリーをどのように見つけられると思いますか?あなたは '--work-tree = ...' argを追加しようとしましたか? –

+0

'express 'の中には、通常のレポのような' .git'フォルダとともに作業ツリーがあります。 – trusktr

+0

'git'に明示的なgit-dirを与えるとき、なぜあなたはgit dirの親が作業木であると仮定することを期待していますか?これは、多くの場合かなり危険な仮定になる可能性があります(特にgit dirが実際に裸のレポである場合) –

答えて

10

git --git-dir=some/dir/.git pullを実行する場合、デフォルトでgitは現在のディレクトリが作業ツリーであるとみなします。 some/dir/.gitの親ではなく、現在のpwdです。つまり、そのコマンドを実行すると、現在のディレクトリが作業ツリーであるかのように更新され、そこに所属していないファイルがpwdに書き込まれます。

--work-treeフラグを--git-dirと組み合わせて使用​​して、作業ツリーの場所を教えてください。この場合、git --git-dir=some/dir/.git --work-tree=some/dir pullが必要です。しかし、実験の後、ここに2番目の問題があるようです。このコマンドをそのまま実行しようとすると、おそらくgit-pull cannot be used without a working treeというメッセージが表示されます。ここで問題と思われるのは、gitは、作業ツリーが相対パスではなく絶対パスである必要があるということです。

本当に実行したいのはgit --git-dir=some/dir/.git --work-tree="$PWD"/some/dir pullです。また、cd some/dir && git pullを試すこともできます。あなたのcwdを変更しない場合は、これをサブシェルで囲むことができます。つまり、(cd some/dir && git pull)です。

+0

サブシェルを使うとコマンドラインで動作しますが、フックスクリプトの中で '(cd some/dir/.git pull&' git pull) 'を実行すると問題はありません。それはうまく動作せず、エラーが表示されます。その場所に存在します( 'fatal:gitリポジトリではありません')。 '/ some/repo'や'/some/repo/.git'の絶対パスにcdするのと同じエラーです。だから、私は--git-dir、そして今は--work-treeを使うことに頼ったのです。しかし、私は絶対パスを使用していますが、 'git-pullは作業ツリーなしでは使用できません 'というエラーが表示されています。私のパスは '/'で始まります。つまり絶対パスです。 – trusktr

+0

はい、 '/'で始まるのは絶対的な意味です。多分、パスは間違っていますか?また、 '(cd some/dir/.git && git pull)'ではなく '(cd some/dir && git pull)'だけを使うべきです。対話型端末でそのディレクトリから 'git pull'を実行できる場合は、スクリプト内のサブシェルから行うことができます。 –

+0

にかかわらず、パスの.gitの有無にかかわらず、私は同じエラーが発生します。私はモバイルから戻ってきたときに投稿します。そして、ええ、私はトリプルチェックして、私は正しいパスを入力しています。 – trusktr

関連する問題