2017-09-22 8 views
0

私は2つのリポジトリを持つgit setupを持っています。どちらも読み書きできます(通常は1つのコードですが、時にはもう一方のコードもあります)。私のワークフローは、通常、自分のローカルリポジトリで作業しています。変更をテストする準備ができたら、自分のプロジェクトを実際にビルドする他のリモートリポジトリにコミットをプッシュします。しかし、何らかの理由で私がローカルからリモートにプッシュすると、リモートリポジトリの変更は「反転」されます。つまり、リポジトリは更新されますが、変更の逆です(つまり、リモートリポジトリをプリプッシュ状態)をインデックスに登録する。例えばリモートgitリポジトリを押すと、古いツリーがインデックスに残る

、私はローカル// This is a comment that has been updatedを言うために更新され、その後、私のリモートレポにプッシュしたコメント// This is a commentでファイルを持って、私は私のリモートレポで次のように得る言う:

remote_repo$ git diff --cached 
-// This is a comment that has been updated 
+// This is a comment 

明らかに私はgit reset --hardを実行することでそれらを同じ状態にすることができますが、これを行う方法やそれを自動化する方法はありますか?私はほとんどの人がgit reset --hardを実行するポスト受信フックを追加することをお勧めしますが、これはきれいな方法で設定できることを期待しています。

+0

サイドノート:この時点でのインデックスの内容は、プッシュ前のインデックス*にあったものです。これは問題の原因です:以前は 'HEAD'コミットだったインデックスと一致しますが、' HEAD'自体は何らかの方法で変更されましたが、今度は別の新しいコミットに解決します。ハードリセット(混合リセットで十分)は必要ありませんが、一般的にこれは少しのトラップです。 – torek

+0

Doh、それは振り返ってみると分かります。私はそれが厄介なワークフローだと気づいていますが、私は両方のリポジトリを所有しており、どちらも他の人がアクセスしていないので、危険は本当に不便です。 – DIMMSum

答えて

2

他のレポで現在チェックアウトされているブランチに移動していると思われます。

該当する設定オプションはreceive.denyCurrentBranchです。それは本来の目的です(そして、私は現在のデフォルトを信じています。以前はこのオプションに遭遇していないと驚きました)。単に、現在のヘッドを更新するプッシュを単に拒否することによって、 "インデックスの逆の変化" 。

作業ツリーを「他の」レポできれいに保つ限り、ケーキを食べて食べることはできません。 receive.denyCurrentBranchupdateInsteadに設定すると、gitは先に進んでヘッドを更新してから、インデックスと作業ツリーを同期させるためのチェックアウトを実行します。

危険な状態で暮らしたい場合は、 push-to-checkoutフックを使用してその制限を回避することもできます。

UPDATE - リンク作業の木が問題に言及していなかったことから、しかしtorekが指摘するように、この角度について考えていませんでした:あなたは、リンク作業の木を使用している場合(つまり、git worktree add)レポにプッシュを受けますreceive.denyCurrentBranchの設定は、リンクされた作業ツリーがチェックアウトされているブランチを保護しません。主な作業ツリーのみが保護されます。必要に応じて、リンクされたツリーに対してupdateInsteadの動作を模倣するポスト受信フックを書くことができると思います。

+0

プッシュが 'git worktree add'とうまくやりとりすることにも気をつけるべきです:https://stackoverflow.com/q/41158057/1256452 – torek

関連する問題