12

私たちは中央の git リポジトリ (gforge) を実行しており、誰もがそこからプルしたりプッシュしたりします。残念ながら、不適切な同僚の中には、10 ~ 100Mb の複数の jar ファイルをリポジトリにプッシュするのは良い考えだと判断した人もいます。この結果、私たちが頻繁に使用するサーバーのディスク容量が不足しています。

手遅れで、ほとんどの人が新しい巨大なレポをプルしたときに初めてこれに気付きました。問題がプッシュされていない場合は、リベースを実行してそれらの巨大なコミットを切り取って修正することもできますが、今では誰もがそこから手を引いてしまいました。そのコミットを削除する (または単にリベースを実行する) 最善の方法は何ですか?大きなファイルを削除してから、誰もがレポから/へプル/プッシュしたいときに混乱を引き起こさないようにしますか?

スクリプト用の小さなレポであるはずですが、現在のサイズは約 700M です :-(

4

5 に答える 5

12

混乱を避ける最も簡単な方法は、サーバーにより多くのディスクを提供することです。

これは大変なことです。ファイルを削除するには、履歴からも削除する必要があります。これは でのみ実行できますgit filter-branch。たとえば、次のコマンド<file>は履歴から削除します。

git filter-branch --index-filter 'git rm --cached --ignore-unmatch <file>' \
--prune-empty --tag-name-filter cat -- --all

問題は、これにより SHA1 ハッシュが書き換えられることです。つまり、チームの全員が新しいブランチ バージョンにリセットする必要があるか、深刻な頭痛のリスクを冒す必要があります。進行中の作業がなく、全員がトピック ブランチを使用している場合は、それで問題ありません。より集中化されている場合、チームが大規模な場合、またはその多くが作業中に汚い作業ディレクトリを保持している場合、少しの混乱と不和がなければこれを行う方法はありません. 全員のローカルを正しく機能させるには、かなりの時間を費やすことができます。書かれてgit filter-branchいることは、おそらく最良の解決策です。計画を立て、チームがそれを理解していることを確認し、進行中の重要な作業が失われたり変更されたりした場合に備えて、チームがローカルリポジトリをバックアップしていることを確認してください.

1 つの可能な計画は次のとおりです。

  1. チームに進行中の作業のパッチを生成してもらいますgit diff > ~/my_wip
  2. チームに、コミットされているが共有されていない作業のパッチを生成してもらいます。git format-patch <branch>
  3. 実行しますgit filter-branch。これが起こっている間は引っ張ってはいけないことをチームが知っていることを確認してください。
  4. チームに発行git fetch && git reset --hard origin/<branch>してもらうか、リポジトリを新たに複製してもらいます。
  5. 以前にコミットした作業を に適用しgit am <patch>ます。
  6. git applyたとえば、進行中の作業を適用しgit apply ~/my_wipます。
于 2012-07-09T14:52:50.453 に答える
7

https://help.github.com/articles/remove-sensitive-dataを確認してください。ここでは、Git リポジトリから機密データを削除する方法について書いていますが、コミットから大きなファイルを削除するためにも十分に使用できます。

于 2012-07-09T14:47:24.517 に答える
4

他の回答に加えて、ユーザー(または少なくとも「非管理者ユーザー」)を禁止するリポジトリ内の事前受信フックの形で、将来の巨大なjarファイルに対する先制保護を追加することを検討することをお勧めします。非常に大きなファイル、またはという名前のファイル、または*.jar最善と思われるものをプッシュすることから。

「一時ブランチで作業を保存し、リセットしてプルし、作業を再適用する」というコツをつかむことができなかった特定のユーザーのために、特定のコミットIDを禁止するなど、これまでにこの種のことを行ってきました。巨大なファイル」。

pre-receiveフックはかなり興味深いコンテキストで実行されることに注意してください。ファイルは実際にアップロードされており、参照(通常はブランチヘッド)が実際にはまだ変更されていないだけです。ブランチヘッドが変更されないようにすることはできますが、ディスクスペースとネットワーク帯域幅を(一時的に、gcされるまで)使用し続けます。

于 2012-07-10T02:06:16.430 に答える
2

フィルターブランチを使用してください!

git filter-branch --tree-filter 'find . -name "*.jar" -exec rm {} \;'

次に、ファイルが含まれていないすべてのコミットを次のようにパージします。

git filter-branch -f --prune-empty -- --all
于 2015-05-07T23:24:35.023 に答える
-1

ここにGForgeの男がいます。これは主に git に関する質問ですが、2 つのことを提供したいと思います。

  1. GForge 6.3から、サイト管理者はディスクを使いすぎているプロジェクトや、古いプロジェクトや孤立したプロジェクトを特定できるようになりました。これは、特に多数の個別のチームやプロジェクトがある場合に、ディスクがいっぱいになる状況を回避するのに役立つ場合があります。
  2. GForge での簡単な git フック (一般的には SCM フック) の実装。サイト管理者は任意の数のフック コマンドを構成でき、プロジェクト レベルのユーザーはプロジェクトに必要なフックを選択できます。特定のタイプ (またはサイズ?) のファイルを防止するフックを追加することは、この機能に適しています。
于 2016-10-15T16:28:04.650 に答える