2017-01-31 15 views
11

私は多くの多くとのgitリポジトリは、(2000+)例えば、コミットがあります。古いgitの履歴を削除するには?

    l-- m -- n 
       /
a -- b -- c -- d -- e -- f -- g -- h -- i -- j -- k 
        \ 
         x -- y -- z 

と私は古いログ履歴を切り捨てるしたい - (例えば)から始まるログ履歴からすべてのコミットを削除し、「Fをコミット"しかし、リポジトリの始まりとして。

どうすればよいですか?

+0

['rebase'](https://git-scm.com/docs/git-rebase)は履歴を変更するためのツールです。 – Maroun

+2

解決したい問題は何ですか? –

答えて

20

いくつかの履歴を失わないようにするには、最初にあなたのリポジトリのコピーを取ってください:)。ここで私達は行く:(<f>あなたがコミット新しいルートになりたいコミットfはSHAです)

git checkout --orphan temp <f>  # checkout to the status of the git repo at commit f; creating a branch named "temp" 
git commit -m "new root commit"  # create a new commit that is to be the new root commit 
git rebase --onto temp <f> master # now rebase the part of history from <f> to master onthe temp branch 
git branch -D temp     # we don't need the temp branch anymore 

あなたが同じ切り捨て歴史を持ちたいリモートを持っている場合。 git push -fを使用できます。 警告これは危険なコマンドです。これを軽く使ってはいけません!コードの最後のバージョンがまだ同じであることを確認したい場合は、 git diff origin/masterを実行できます。変更は表示されません(履歴のみが変更され、ファイルの内容は変更されないため)。

git push -f 

次の2つのコマンドはオプションです。git repoを良好な状態に保ちます。

git prune --progress     # delete all the objects w/o references 
git gc --aggressive     # aggressively collect garbage; may take a lot of time on large repos 
+0

私は必要なものを鳴らしますが、私が3番目のステップ(git rebase ...)を実行するたびに、私は競合を起こします。それは普通ですか? – user3475757

+0

いいえ、それは正常に見えません。第3のステップで ''部分(つまり、tempブランチを作成したのと同じコミットシャー)を含めましたか? –

8

あなたの問題の可能な解決策は、--shallow-sinceオプションを使用してgit cloneにより提供されます。 f以降コミット回数が少なくても問題がない場合は、--depthオプションを使用できます。

第2のオプション(--depth)は、指定されたブランチだけをクローンします。追加のブランチが必要な場合は、元のリポジトリをリモートとして追加し、git fetchを使用してそれらを取得することができます。

結果に満足したら、古いリポジトリを削除し、新しいリポジトリの名前を変更して置き換えます。古いリポジトリがリモートの場合は、削除後に再作成し、新しいリポジトリからそのリポジトリにプッシュします。

このアプローチには、サイズと速度の利点があります。新しいリポジトリには、必要なコミットのみが含まれています。古いオブジェクトを削除するには、git pruneまたはgit gcを実行する必要はありません(存在しないため)。

+2

良い選択肢。 +1 –

+0

履歴は保存したいがリモートのみの場合は、最後の手順を行わないでください。私のアプリケーションでは、これが最適な設定です:私はそれが必要な場合にリモートで膨大な履歴を持っていますが、ローカルクローンとアップデートはすばやく多くのディスクスペースを占有しません。 – Liam

関連する問題