2012-02-10 15 views
4

私のold questionを数回編集したら、今度は新しい質問ですので、新しいものを作ります。 .git/hooks/post-updategit post-updateスクリプトがうまくいきません

私が持っている:

echo "a" >> /home/pi/log 
git update-server-info 
git stash 
git merge testing >> /home/pi/log 

自動化されたチェックアウトを作るために。だから私は、クライアント上で実行します。

git push testing HEAD:testing 

今私の/home/pi/logは含まれています

a 
Updating ae2f44b..04753a9 
Fast-forward 
application/views/main/index.php | 2 +- 
1 files changed, 1 insertions(+), 1 deletions(-) 

しかし、ファイルが変更されませんでしたの!私は、スクリプトを削除した場合

$ git merge testing 
Already up-to-date. 

は、プッシュをすると、git stashそれが動作git merge testingを実行します。

更新

テストのために私は

git show application/views/main/index.php 

しかし

vim application/views/main/index.php 

を実行する場合、私は右のファイルのバージョンを見ることができる17から20までのファイルに番号を変更まだ古い番号が含まれています。しかし、Gitは、ファイルが更新されると主張:

$ git merge testing 
Already up-to-date. 
+0

スクリプトの実行コンテキストで環境変数GIT_DIR、GIT_WORK_TREE、およびGIT_INDEXを確認できますか? – sehe

答えて

2

解決策は、Alexが指摘したようにpost-receiveを使用することです。また、スクリプトの先頭にunset GIT_DIRを実行する必要があります。サーバー上で

私は2番目のブランチを作成し、それに切り替えている:

$ git branch 
    master 
* testing 

マイ.git/hooks/post-receiveは次のようになります。私はgit pushを実行するクライアントで

unset GIT_DIR 
cd .. 
git merge master 

5

EDIT

this is your problemのように見えます:これらのフックは、いずれかの裸または非裸で実行することができます

pre-receive 
update 
post-receive 
post-update 

リポジトリ。 の両方の場合、現在の作業ディレクトリはgitディレクトリになります。したがって、 が "/src/git/test.git/"と呼ばれる裸のリポジトリであれば、それは現在の 作業ディレクトリになります。これが非裸のリポジトリであり、最上位のレベルが の場合、作業ツリーは次のようになります。 "/ home/mark/test /"の場合、現在の作業ディレクトリ は "/home/mark/test/.git/"になります。

どちらの場合も、以下の環境変数が設定されている:「」 GIT_DIRがに設定されている

作業ツリーでは、私はに先にリンクさクリス ヨンセンの答えで説明したように、これは、予想外に厄介です。 --git-dirまたはGIT_DIRが指定されているが、--work-tree, GIT_WORK_TREEcore.worktreeのいずれも指定されていない場合は、現在の作業 ディレクトリは最上位ディレクトリとみなされます。

注:のみGIT_DIRは、その後 を設定されている場合はgitのmanページから、このコメントが適用されますあなたの作業ツリーの

つまり、作業中のツリーも現在のディレクトリ( ".git"ディレクトリ)になります。ほとんどの場合、これはあなたが望むものではありません。

あなたはフックの内側


GIT_WORK_TREE=..GIT_WORK_TREE="$GIT_DIR/.."を設定してみてください可能性がありますが、ファイルは変更されませんでした!

おそらくそうでした。多分、線形化だけが行われたか、差分を見るときに無視される空白の変更があったのですが、変更されました。ファイル内容のSHA1の合計が変更されたので、Gitは知っています。

いずれかの端に窓を使用していますか?

Windowsでは、行末が混乱する傾向があります。 core.autocrlfおよび関連オプションを参照してください:

+0

はい、クライアントはWindows上にあります。これはどうしたら問題になるのですか?手動では動作しますが、スクリプトでは動作しないのはなぜですか? – PiTheNumber

+0

ファイル内の数字を数えます。 17は、行末や空白に関係なく、20とは異なる必要があります。それじゃない? – PiTheNumber

+0

いつもPEBCAKです!私はあなたの答えがその質問にどのように関係しているかわからないので尋ねます。私は行の終わりに問題はありません。どこにいなくても、文字列「20」をコミットする理由は説明できません。また、サーバー上の更新ファイルには「17」が含まれています。 – PiTheNumber

1

あなたの代わりにpost-receiveフックを使用しようとしましたか?おそらく何かがまだpost-updateで終わっていないかもしれません。それがマージがうまくいかない理由です。

また、git reset --hardをスクリプトに含めて、gitの状態がファイルシステムと同期するようにしてください。

+0

私は試みたが、それは全く実行されていない。 – PiTheNumber

関連する問題