4

現在、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のファイルの内容が表示されました。ローカルとリモートのリポジトリで変更が正常にコミットされているのを見ることができるので、それは奇妙ですが、その後、ファイルが以前のコンテンツに再び変更されたように見えます...

その例:

  1. コンテンツが「12345」のファイルをコミットしてプッシュし、その文字列を「54321」に置き換えます
  2. 上記のコードを実行します
  3. git logファイルが正しくコミットされたことを示しています。リモートリポジトリでは、コンテンツが「54321」のファイルが表示されますが、ローカルでは次のようにgit diff --cached表示されます。

    @@ -1 +1 @@
    -54321
    +12345
    
4

1 に答える 1