2017-11-21 12 views
0

最後の3つのコミット履歴だけで孤立したブランチを作成したいですか?最後の3つのコミットでgit orphanブランチを作成するには?

MASTER -> A - B - C - D - E - F 
NEW ORPHAN -> D - E -F 

これは、新しいオーファンブランチを保持し、既存のブランチを削除して、より少ないディスク容量を使用したいと考えています。

+0

目的はディスクスペースを確保していますか?_あなたはその歴史の中で何を持っていますか(誤ってUbuntuのISOなど)?また、 'git gc'を試してみましたか? – msanford

+0

いいえ、大きなファイルをgitリポジトリにバックアップする作業を自動化したいと思います。古いものを削除している間に最新のバックアップを取ることができるようにします –

+0

最後の3つのコミットだけがある場合は、最初の3つの情報が失われ、後で変更されません。あるいは、新しい 'D'は' A..C'を組み込むべきですか? – Useless

答えて

3

真実は、おそらくあなたが提示する問題の解決策ではありません。それは大きなファイルを扱う際には大したことではなく、削除されたコミットから実際にディスクスペースを解放することは難しいです(は保持履歴ではです)。したがって、最も有用な答えは、そうではありません。

さらに、技術的に完全な回答を提供します。

古いコミットを破棄する予定の場合は、孤立したブランチを使用する必要はありません。あなたは持っているブランチをリベースすることができます。最も簡単な方法は、対話型のリベースです。

git rebase -i 

コミットごとに、TODOリストが表示されます。 BC、およびDのエントリを探し、それらのエントリの最初の単語(コマンド)をpickからsquashに変更します。

あなたは、そのコンテンツ(TREEABCDの、E'、及びF'それぞれオリジナルDからのもの、E、及びFと一致

A -- B -- C -- D -- E -- F 

ABCD -- E' -- F' <--(master) 

で残されます。これは、孤立したブランチを使用して作業するのと同じ状態です。

特に、参照によって到達できない場合でも、オリジナルはAからFまでのコミットが存在することに注意してください。十分な時間が与えられれば、彼らは再生されるだろう。まず、reflogをロールオフする必要があります(または、reflogを破壊する必要があります)。その後、git gcを実行する必要があります。

リバース後に新しいクローンを作成することが簡単です。

もちろん、インタラクティブなリベースはスクリプトにとって最も簡単なものではありませんので、反復可能なプロシージャが必要な場合は、少し違うことをしなければならないかもしれません。あなたはまだ古いコミットは、スペースを消費し続けてデータベースにぶらぶらしている問題を抱えている

# get the work tree for a new root 
git checkout master~2 
# break from history 
git checkout --orphan new_master 
# start the new branch 
git commit -C master~2 
git rebase --onto new_master master~2 master 
git branch -d new_master 

ようなスクリプトに何かを書くことができます。

「浅い枝」を使用することもできます。私が知る限り、浅いブランチはクローンによってのみ作成されますが、データベースから古いオブジェクトをパージする面ではプラス側に作成されます。これにより、コミットメタデータ(およびコミットID)も保持されます。

git clone --depth=3 --no-single-branch file://localhost/path/to/old/repo new-repo 

depthオプションは、レポに初期深さを設定しますのでご注意ください。レポを定期的に「浅く」しなければなりません。

関連する問題