現在、Pygit 0.24.1 (libgit 0.24.1 と共に) を実行しており、2 つのブランチ ( と など) があるリポジトリで作業していprod
ますdev
。
すべての変更は、最初にブランチにコミットさdev
れ、リモート リポジトリにプッシュされます。そのために、次のコードがあります。
repo = Repository('/foo/bar')
repo.checkout('refs/heads/dev')
index = repo.index
index.add('any_file')
index.write()
tree = index.write_tree()
author = Signature('foo', 'foo@bar')
committer = Signature('foo', 'foo@bar')
repo.create_commit('refs/heads/dev', author, committer, 'Just another commit', tree, [repo.head.get_object().hex])
up = UserPass('foo', '***')
rc = RemoteCallbacks(credentials=up)
repo.remotes['origin'].push(['refs/heads/dev'], rc)
これは非常にうまく機能し、ローカル コミットとリモート コミットも確認でき、ローカル リポジトリはクリーンなままです。
コミットするものは何もありません。作業ディレクトリはクリーンです
次に、prod
ブランチにチェックアウトし、HEAD コミットをマージしたいと考えていdev
ます。そのために、次の別のコードを使用します (dev
ブランチへのチェックアウトを常に開始すると仮定します)。
head_commit = repo.head
repo.checkout('refs/heads/prod')
prod_branch_tip = repo.lookup_reference('HEAD').resolve()
prod_branch_tip.set_target(head_commit.target)
rc = RemoteCallbacks(credentials=up)
repo.remotes['origin'].push(['refs/heads/prod'], rc)
repo.checkout('refs/heads/dev')
ブランチがローカルとリモートの両方でマージされているのを実際に確認できますが、このコードの実行後、コミットされたファイルは常にブランチで変更された状態のままになりますdev
。
ブランチ dev で
コミットする変更: (「git reset HEAD ...」を使用してステージングを解除します)
変更: any_file
ただし、誰もそのファイルを変更していないと確信しています。実際には、 agit diff
は何も示していません。この問題は、既にコミットされたファイル (つまり、以前に少なくとも 1 回コミットされたファイル) でのみ発生します。ファイルが新しい場合、これは完全に機能し、ファイルはクリーンな状態のままになります。
いくつかの詳細が欠けていると確信していますが、それが何であるかを見つけることができません。ファイルが変更されたままになっているのはなぜですか?
編集: 明確にするために、私の目的は FF (Fast-Forward) マージを行うことです。Pygit2 のドキュメントに非 FF マージの実行に関するドキュメントがあることは知っていますが、ブランチを介してコミット ハッシュを保持するため、最初の方法をお勧めします。
EDIT 2:@Leonのコメントの後、私はダブルチェックしましたが、実際にgit diff
は出力が表示されず、コミット前git diff --cached
のファイルの内容が表示されました。ローカルとリモートのリポジトリで変更が正常にコミットされているのを見ることができるので、それは奇妙ですが、その後、ファイルが以前のコンテンツに再び変更されたように見えます...
その例:
- コンテンツが「12345」のファイルをコミットしてプッシュし、その文字列を「54321」に置き換えます
- 上記のコードを実行します
git log
ファイルが正しくコミットされたことを示しています。リモートリポジトリでは、コンテンツが「54321」のファイルが表示されますが、ローカルでは次のようにgit diff --cached
表示されます。@@ -1 +1 @@ -54321 +12345