0

git-p4 を使用して大きなリポジトリをインポートしたところ、奇妙な大文字と小文字が混在するファイル名がいくつかあることがわかりました。

dirA/DIRb/file1.txt

そして、次のような他のファイル:

DIRa/dirB/FILE2.txt

等々。git-p4 は fast-import を使用するため、これらはこの方法でリポジトリに入力されます。これにより、Git は不思議なことに、追跡されていないディレクトリがあり、追跡されていないわけではなく、新しいファイルがないと主張します。この質問を読んで発見しました:

追加後もgitは追跡されていません

特にslayerIQの答えは、問題のディレクトリの名前を変更して一致するケースを持つことで修正できるということです。実際、ファイルに単一のケース形式しかないいくつかのケースでは、これで修正されました。しかし、上で述べたような混乱したものについては、何もしません。この種のリストは、このケースに関する私の疑いを裏付けています。

git ls-tree --name-only -r branch

履歴の書き換えを使用して修正することを検討しましたが、それは非常に重いようで、必要がない限り、そこに行くのを少しためらっています (ツリーは ~25K ファイルです)。一方、私はクリーンなツリーで「git status」を実行し、約 35 の「追跡されていない」パスのリストを取得します。だから、それはちょっと受け入れられない。

必要に応じて git-p4 のクローンを最初から作成することもできますが、大文字と小文字が混在するパスは Perforce 自体から来ていると思われます。SmartGit にはツリーに関するこの問題はなく、正確なツリーを新しいレポにコピーしても問題なく動作します (正しく追加されているため)。

続行する方法についてのアイデアはありますか?

ありがとう :)

4

1 に答える 1

0

私は先に進んで試しgit filter-branch --tree-filter "" HEADましたが、何もしませんでした。たぶん、私が見逃した、それでこれを行うためのよりきれいな方法があります。(私のgit-fuは弱いです。)

これは醜い、醜い、醜いですが、少なくとも1つの方法を見つけました:

  • git-p4 rebaseすべてを最新の状態にします。

  • .gitを別のディレクトリにコピーします。

  • その新しいディレクトリに切り替えて、ツリーを更新しますgit reset --hard

  • コピーした光沢のあるものを削除し.gitます。最新の Perforce チェックインを備えた手付かずのツリーがあります。

  • git initそしてgit add -Agit commit新しいツリーで最初のチェックインを行います。コミット メッセージについては、git-p4 の最初のチェックイン メッセージを模倣します。

Initial import of //depot/ from the state at revision #head

[git-p4: depot-paths = "//depot/": change = 58840]

  • もちろん、58840 を以前の最後のリビジョンに更新し、デポ パスを適切なものに更新します。(他のツリーのコミット ログを見ると、知っておくべきことがすべてわかります。)

  • git gcその後、物事をひどく遅くしたくない場合。

これで、基本的な非 git-p4 ツリーができたはずです。リモート参照も設定する必要があります。これを行うための巧妙な git の方法があると確信していますが、私はそれを知りません。

  • git logインポート リビジョンを検索します。その SHA ID をメモします。

  • 元のレポの.git/refsツリーを見てください。にコピー.git/refs/remotes<newrepo>/.git/refsます。refs/remotes/p4/masterHEAD の SHA ID を反映するように編集します。

これで、git-p4 自体がチェックアウトしたように見える完全に機能するレポができましたが、大文字と小文字は一致しています。もちろん、以前のローカル履歴を失いました:(しかし、これを早い段階で行えば、それほど大したことではありません.

git-p4 が引き続き fast-import を使用している場合、問題が時間の経過とともに再発するかどうかはわかりませんが、ツリーがクリーンなgit statusときにクリーンオンとして表示されるようになりました。

于 2010-11-02T20:22:40.587 に答える