3

(小さなテスト リポジトリで)各コミット.patchのコマンドで生成された一連のファイルにリポジトリをエクスポートしgit format-patchてから、空のディレクトリで "git init" を使用し、続いてgit apply各パッチ ファイルのコマンドを使用してリポジトリを再構成しようとしました。うまくいきました --- 1 つだけ問題git amがありました -- パッチの ID タグを保存する代わりにリポジトリにパッチを適用すると、新しい ID タグが生成されます。これは、どのコミットが冗長で、どのコミットがそうでないかを判断するのが難しくなるため、後で問題になる可能性があります。

リポジトリのクローンを作成する通常の方法を使用しない理由についてgit cloneは、一般的に言えば、リポジトリのクローンを作成するために使用git cloneしますが、現時点では、それが可能かどうかを確認するための非常に具体的な理由があります。このように、ここで詳細を説明するには長すぎます (理由については、この質問の後半で言及するかもしれません) --- そして、これらの理由が長すぎるだけでなく、それらの最終的な詳細が、この質問の正解は。

.patchただし、この目的に使用するのに適切なファイル形式ではないと言われたら、私はそれを受け入れます。私がやりたい最も重要なことは次のとおりです。

  1. リポジトリへの個々のコミットを個々のファイルに抽出し、リポジトリ履歴などでそれらのファイルの順序を知ることができます。

  2. コミットの抽出されたバージョンに基づいてリポジトリを完全に再構成できる

  3. 後で、作成すべきではなかったと私が特定したコミットを「非正規化」できるようにする (そして、リポジトリの履歴に保持することは、プロジェクトの履歴サイズに原因となる肥大化に値しない) ので、次のことができます。 「正規化されていない」コミットなしでリポジトリを再構成します。(ちなみに、側面 3 は、私がこれを実行できるようにしたい理由に大きく関係しています。)

4

1 に答える 1

2

あなたがここで何を求めているのか、私には 100% 明確ではありません。「コミットIDタグ」と言うときは、SHAを意味していると思います。そして、「パッチIDタグ」の意味がまったくわかりません。

だから推測...

git でコミットを作成すると、6 つのメタデータが添付されます。それらは、作成者名/電子メール/時間とコミッタ名/電子メール/時間です。新しいコミットをゼロから作成する場合、作成者名/電子メールとコミッター名/電子メールの両方が一致します。

彼らはする必要はありません。GIT_AUTHOR_NAME および同様の環境変数を介してそれらをオーバーライドできます。チェリーピックまたはリベースすると、それらが変更されます。

実行しても、コミッター情報はまったくgit format-patch提供されません。同様に、実行時にコミッター情報を検索するのではなく、実行中のユーザーの名前と電子メールで上書きします。これにより、その情報が変更されると、別の SHA が作成されます。git amgit am

これを回避する簡単な方法はありません (comitter 情報を保持するには、format-patch と am の両方をハックする必要があります。ただし、コミット SHA を比較する代わりに、コミット パッチ ID (git patch-id) を計算してそれらを比較することができます。同一である必要があります。

于 2014-09-30T21:04:40.980 に答える