シナリオは次のとおりです。
14 個の個別の git リポジトリに変換したい大きな CVS リポジトリがあります。プロセスのcvs2git
一部は問題なく、大きなリポジトリ repo.git につながります。
14 個の git リポジトリのそれぞれについて、メイン リポジトリのクローンを作成し、次のコマンドを実行します。
git filter-branch -d /tmp/rep --tag-name-filter cat --prune-empty --subdirectory-filter "sub/directory" -- --all
ただし、このコマンドの前に、git filter-branch
あるディレクトリから別のディレクトリにファイルを移動するためにコミットを書き直す必要があるため、いくつかの git リポジトリに対して別のコマンドを実行する必要があります。は--tree-filter
、私が使用するオプションです。以下は、実行されたコマンド ラインの例です。
script_tree_filter="if test -f rep/to/my/file && test -d another/rep ; then echo Moving my file ; mv rep/to/my/file another/rep; fi"
git filter-branch -d /tmp/rep --tag-name-filter cat --prune-empty --tree-filter '$script_tree_filter' -- --all
プロセスの最後に (14500 件のコミット: 約 1 時間かかります!) refs を消去し、次を使用しますgit gc
。
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --prune=now
最後に、サイズが 1.2Go のリポジトリを取得します (これは明らかに大きすぎます)。コミットを見ると、古いものがたくさん残っていることがわかります。それらは、コマンドの後にもうここにあるべきではないファイルとディレクトリに関係しています--subdirectory-filter
。
コミットの履歴では、次の図に示すように、不要なコミットと適切なコミットの間に不連続がありますgitk --all
。
それらのいくつかのタグのおかげで、それらのコミットがまだ存在していることは確かです。この場合、適切なコミットのタグを削除せずにそれらのタグを削除することは可能ですか?
タグが理由でない場合、何か考えはありますか?
詳細については、refs
ディレクトリのコンテンツ (subdirectory-filter によって取得された git リポジトリ内) が空です:
$ ls -R refs/
refs/:
heads original tags
refs/heads:
refs/original:
refs
refs/original/refs:
heads tags
refs/original/refs/heads:
refs/original/refs/tags:
refs/tags:
packed-refs
ブランチとタグがgit リポジトリのファイルにリストされていることがわかりました。
d0c675d8f198ce08bb68f368b6ca83b5fea70a2b refs/tags/v03-rev-04
95c3f91a4e92e9bd11573ff4bb8ed4b61448d8f7 refs/tags/v03-rev-05
ファイルには 817 個のタグと 219 個のブランチがリストされています。