3

最近、(Bitbucket から) GitHub にリポジトリをインポートしようとしましたが、インポートに失敗しました。GitHub のテクニカル サポートから、リポジトリで「不正な日付」の問題が発生しているため、リポジトリで実行する必要があるとの連絡がありましgit fsckた。そこで、BitBucket から複製して実行したところ、次のgit fsckようになりました。

git fsck Checking object directories: 100% (256/256), done. 
error in commit fda45b4b6b06f6b815341c1f26de827c769f48b6: badDate: invalid
 author/committer line - bad date error in commit
 636d259fd0ac343af2a5561ff799a54a6aeb9b1c: badDate: invalid
 author/committer line - bad date error in commit
 41dc786816992e3c42c904e8c848aa1078475386: badDate: invalid
 author/committer line - bad date error in commit
 c55a0fa0d98e02aa4621be202d7b7d21ed2ff2ab: badDate: invalid
 author/committer line - bad date error in commit
 e6ad8f5ea7cf6441b6ea6ab5583117113a8f49fb: badDate: invalid
 author/committer line - bad date error in commit
 4aea97fdd999484319a9fbbc4dc42b024e1eba80: badDate: invalid
 author/committer line - bad date error in commit
 531f7783e383868c1d52a1bf2dc3212f5e10a91c: badDate: invalid
 author/committer line - bad date Checking objects: 100% (546/546),
 done.

まあ、それはどうして起こったのですか?それを修正し始める方法すらわかりません。「悪い日付」を検索しても、有益なアドバイスは得られませんでした。

親切な git グルは、私を正しい方向に導いてくれますか?

4

2 に答える 2

2

まあ、それはどうして起こったのですか?

誰かが不適切なバージョンの Git (または Git オブジェクトを構築するための不適切なツール) を使用しました。誰が、いつ、どのように、などを言うことはできませんが、さまざまな悪いコミットを調べると、おそらくいくつかの非常に大きな手がかりが得られるでしょう。

author A U Thor <thor@example.com> 1575578639 -0800

また:

committer A U Thor <thor@example.com> 1575578639 -0800

日付と時刻のスタンプは、最後の 2 つの数値フィールドです。その間にあるものは、使用していた Git のバージョンを誰に尋ねるかを教えてくれるでしょう。

それを修正し始める方法すらわかりません。

技術的には、悪いコミット自体を修正することはできません。その理由は、悪いかどうかにかかわらず、コミットの生データコミットのハッシュ ID のソースであるためです。ハッシュ IDコミットの実際の名前であるため、コミットの実際の名前では、コミットのデータが不正である必要があります。それらを修正した場合、それらは異なるコミットになり、異なるハッシュ ID 名を持つことになります。

VonC が言ったように、新しい互換性のない、しかし修正されたリポジトリを作成するには、これらの悪いコミットのそれぞれを、おそらくgit filter-branchまたは新しいgit filter-repo. 使用するツールや方法が何であれ、不適切なコミットのコミット ヘッダー内の不適切な行authorや行を、新しい正しい行 (Git の内部要件を満たす日付と時刻のスタンプ) に置き換える何らかの方法を提供する必要があります。committer

これらのコミットの直接の子は、データの一部として親のハッシュ ID (悪いコミットのもの) を内部に保存するため、悪いコミットを修正したものに置き換えたら、後続の (子孫) コミットもすべて置き換える必要があります。そのため、親ハッシュ ID以外のすべてを保持する、修正された新しい子コミットを作成する必要があります。これは子コミットの子を無効にするため、それらも書き換える必要があります。すべての子孫コミットです。

これはまさに、これらの filter-branch / filter-repo ツールが行うことです。あなたは(どういうわけか)リポジトリで悪いコミットを選び出し、代わりにそれを新しく改善されたコミットにコピーします。次に、元の悪いコミットのすべての子孫もコピーするため、修正されたコミットから派生した新しい家系図が作成されます。

リポジトリ内の一連のコミットはそのリポジトリの履歴であるため、これらのコミットをすべてコピーすると、まったく新しい履歴 (新しいリポジトリ) が作成され、古いリポジトリのすべてのユーザーが使用するために切り替える必要があります。したがって、リポジトリを修正する技術的な部分は、通常、このプロセス全体の中で最も簡単な部分です。何が問題なのか、ツールを使用して履歴を書き換える方法を突き止めるには多少の作業が必要ですが、それを一度行えば完了です。ただし、古いリポジトリのすべてのユーザーを追跡し、何らかの方法で、そのリポジトリの使用をやめて、代わりに新しく改良されたリポジトリを使用するよう説得する必要があります。

于 2019-12-08T01:00:27.027 に答える