このシナリオは次のとおりです。git filter-branchは切断された履歴につながった:古いコミットを取り除く方法?
私は14の異なるgitリポジトリに変換したい大きなCVSリポジトリを持っています。 プロセスの一部であるcvs2git
は問題なく、大きなリポジトリリポジトリにつながります。 14 Gitのレポのそれぞれについて
、私はメインのレポのクローンを作成し、私は、次のコマンドを実行します。
git filter-branch -d /tmp/rep --tag-name-filter cat --prune-empty --subdirectory-filter "sub/directory" -- --all
しかし、このコマンドの前に、私はいくつかのgitリポジトリのために別のgit filter-branch
コマンドを実行する必要があるためディレクトリから別のファイルに移動するためにコミットを書き直さなければなりません。 --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時間かかります)私はレフリーをきれいにし、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
に見られるように、コミットの歴史の中で
は、不要なコミットと良いものの間に不連続性があります:
私はそれらのコミットが原因で、まだ存在していることをかなり確信していますタグを付けてください。この場合、良いコミットのタグを削除せずにこれらのタグを削除することは可能ですか?
タグが理由でない場合は、何か考えてください。詳細については、(サブディレクトリフィルタによって得られたgitリポジトリ内)refs
ディレクトリの内容が空である
:
$ 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
d0c675d8f198ce08bb68f368b6ca83b5fea70a2b refs/tags/v03-rev-04
95c3f91a4e92e9bd11573ff4bb8ed4b61448d8f7 refs/tags/v03-rev-05
ファイルに817個のタグと219個のブランチがリストされています。
'git gc'はタグrefsを.git/packed-refsにパックするので、空のディレクトリになります。私はなぜタグが古いコミットを指しているのかは分かりませんが、各フィルタブランチopは '--tag-name-filter'を使っています.... – torek
この記事の4つのコマンドに従ってクリーンアップしましたか? ?http://stackoverflow.com/a/7966852/11343 – CharlesB
'reset hard'を除いて、私の質問で述べたように3つのコマンドを実行しました(' rm -rf .git/refs/original/'は私は裸のリポジトリを持っているので同じ方法)。私はgcの '--agentive'オプションを使用しませんでしたが、私は試してみることができません(私は何も変わらないと思います)。 – Frodon