5

私のローカルファイルシステムでは、gitレポジトリ(A)のヘッドのみを複製できるようにしたいので、新しいgitレポジトリ(B)に履歴が表示されません。しかし、スペースを節約するために、現在Bにあるファイルのハードリンクの利点が必要です。これを行う方法はありますか?ハードリンクは、レポAが変更された後でも役立ちますか?

ありがとう!

4

2 に答える 2

6

少なくともgit1.7.12の時点では、オブジェクトデータベース間のハードリンクを使用してローカルの浅いクローンを作成することは不可能のようです。ローカルクローンでは無視され、を使用するようにgit clone --depth 1 --single-branch明示的に警告します。したがって、ハードリンクと浅いクローンのどちらかを選択する必要があります。--depthfile://

gitは新しいオブジェクトを新しいファイルに追加し、既存のファイルを変更することはないため、ハードリンクはリポジトリが変更された場合でも少なくともしばらくは機能します。ただし、効率を上げるためにオブジェクトデータベースを再パックすることがあり、ハードリンクをどのように保持できるかわかりません。

シャロークローンを選択した場合は、git clone --single-branch --depth 1 file://old_repo_dirオプションを使用してクローンを作成できます。--depth 1これは1つの履歴アイテムを意味するので、最新のコミットだけでなく、その親(またはマージの場合は親)も取得するのは面倒です。親は元のリポジトリからコミットメッセージを取得しますが、実際にはコミットにツリー全体の作成が含まれているため、コミットメッセージは嘘になります。

私は、最初のツリーを作成する自分が選択したコミットメッセージを含む単一のコミットから始めることを好みます。これは、最初に古いリポジトリに履歴のない新しいブランチを作成し、次にそのブランチを新しい空のリポジトリにプルすることによって取得されます。私はこれを、673kオブジェクト(Emacs bzrリポジトリをgitに変換)を備えた664MBオブジェクトデータベースを備えた巨大なリポジトリでテストしました。新しいリポジトリがプルを受け取ったとき、3477個のオブジェクトを含む36MBのオブジェクトデータベースがあったため、余分なコンテンツは明らかに削除されました。正確な手順は次のとおりです。

# at the old repo:
git checkout --orphan tmp-snapshot
git commit -m "Initial commit."

# at the new repo location:
git init
git pull OLD_REPO_DIR tmp-snapshot:master

# back at the old repo:
git branch -D tmp-snapshot   # no longer serves a purpose

これmasterで、新しいリポジトリのブランチには、古いリポジトリのツリーと同じツリーを持ち、履歴のない単一のコミットが含まれます。

于 2012-09-19T19:44:28.137 に答える
2

それを複製してから、親を取り除くヘッドコミットを再作成できます。元のリポジトリのオブジェクトがパックに入っている可能性が高いことを考えると、とにかく、必要以上にハードリンクすることになります。はい、ハードリンクはしばらくそのままですが、gcなどを開始すると、効果がなくなる可能性があります。ハードリンクの代わりに代替を使用することもできます。

ツリーからコミットを作成するためのドキュメントを検索してgit commit-treeください。正確な構文はわかりません。

于 2012-09-19T19:04:49.717 に答える