1

最後の大きな CVS リポジトリの 1 つを Git リポジトリに移行する予定です。

移行には、svn2git の cvs2git を使用しています。この CVS リポジトリは 12 年以上にわたって成長したため、31 GB のデータがあります。

指定された期間 (たとえば 2 年) より古いすべての履歴を削除する解決策が見つかりませんでした。

このいずれかのツール/コマンド/解決策を知っていますか?:

  • CVS からの削除履歴
  • cvs2git ですべての履歴をエクスポートしない
  • Git インポートですべての履歴をインポートしない
  • Git から履歴を削除

感謝と挨拶、 アンドレアス

Dmitry Oksenchuk によって提案された解決策: グラフトを編集した後、BASH スクリプトを作成して、めちゃくちゃになったタグとブランチをクリーンアップしました。

#!/bin/bash

NEW_ROOT_REF=$1
git tag --contains $NEW_ROOT_REF | sort  > TAGS_TO_KEEP.tmp
echo "Keep Tags:"
cat TAGS_TO_KEEP.tmp | wc -w

git branch --contains $NEW_ROOT_REF | sort  > BRANCHES_TO_KEEP.tmp
echo "Keep Branches:"
cat BRANCHES_TO_KEEP.tmp | wc -w

git tag -l | sort > TAGS_ALL.tmp
echo "All Tags:"
cat TAGS_ALL.tmp | wc -w

git branch -l | sort > BRANCHES_ALL.tmp
echo "All Branchess:"
cat BRANCHES_ALL.tmp | wc -w

# Remove tags
COUNTER=0
for drop in `comm TAGS_ALL.tmp TAGS_TO_KEEP.tmp -23`; do
        git tag -d $drop
        COUNTER=$[$COUNTER +1]
done
echo "Dropped tags: $COUNTER"

# Remove branches
COUNTER=0
for drop in `comm BRANCHES_ALL.tmp BRANCHES_TO_KEEP.tmp -23`; do
        git branch -D $drop
        COUNTER=$[$COUNTER +1]
done
echo "Dropped branches: $COUNTER"

# Clean up
rm TAGS_ALL.tmp TAGS_TO_KEEP.tmp BRANCHES_ALL.tmp BRANCHES_TO_KEEP.tmp
4

1 に答える 1

2

通常、整形式の Git リポジトリでは、履歴の深さは問題になりません。Linuxレポには50万件以上のコミットがあり、正常に動作しています。今年は、約 15 年前の CVS リポジトリ (5 GB の,vファイル) を Git に移行しました。Git リポジトリには最大 200 MB かかり、最大 70,000 のコミットが含まれています。

バイナリ ファイルとタグの数という 2 つの大きな問題に直面しました。

バイナリ ファイル

CVS では、バイナリ ファイルのすべてのリビジョンがサーバーに保存され、現在のリビジョンのみがチェックアウト時に転送されます。したがって、バイナリ ファイルを CVS に格納することはまったく問題ではありません。サーバーに十分なディスク領域が必要なだけです。Git では状況が異なります。Git リポジトリのクローンを作成すると、バイナリ ファイルのすべてのリビジョンがローカル クローンに転送されます。ファイルが最新のコミットに存在しない場合でも、その履歴リビジョンはすべてローカル リポジトリにあります。不要なバイナリ ファイルを履歴から削除することで、Git リポジトリのサイズを ~700MB から ~200MB に縮小することができました。ここで重要な点は、CVS ではなく Git のファイル サイズに基づいて決定することです。Git は zlib 圧縮とデルタ圧縮を使用してオブジェクトをパックするため、同じファイルの履歴が Git と CVS でまったく異なるディスク容量を使用する可能性があります。

タグ数

CVS リポジトリには 20,000 を超えるビルド タグがあります。このような数のタグを使用すると、Git 拡張機能とソース ツリーの両方の動作が非常に遅くなります (特に、すべてのタグをドロップダウン リストにロードする必要がある場合)。Git 2.3.0 で修正さgit pushれたパフォーマンス リグレッションのために、Git 1.9.5 も非常に遅くなりました。現在、Git では、最近 2 年間のビルド タグ (〜 7,000 タグ) のみを保持し、古いタグを定期的にアーカイブしています。

古い歴史を捨てる

それでも必要な場合は、古い履歴を Git に削除する方が、CVS や移行中に削除するよりもはるかに簡単で安全です。

  1. ファイルに新しいルート コミットを設定しgraftsます。echo %commit_hash% >.git/info/grafts
  2. そのコミットを含まないすべてのタグとブランチを削除します (git tag --containsおよびを参照git branch --contains) 。
  3. コミット グラフを書き直します。git filter-branch --tag-name-filter cat -- --all

または、git-dump.datファイル (git fast-import 形式の cvs2git の出力) を解析して、そこから古いコミット、タグ、およびブランチを削除することもできます。

于 2015-10-22T10:38:56.680 に答える