2012-07-09 8 views
7

誰もがプッシュしてプッシュする中央のgitリポジトリ(gforge)を実行しています。残念なことに、いくつかの不適切な同僚は、いくつかの10〜100MBのjarファイルをレポにプッシュすることをお勧めしました。その結果、私たちが使用するサーバーのディスク容量が不足しています。gitから大きなコミットを削除する

私たちはそれが遅すぎて、ほとんどの人が新しい巨大なレポを引っ張ってしまったときにしかこれを認識しませんでした。問題がプッシュされていない場合は、リベースして大規模なコミットをスナップして修正することができますが、今では誰もがそのコミットを取り除きました。そのコミットを削除する最良の方法は何ですか?大きなファイルを削除して)にしないと、誰もがレポをプル/プッシュしたいときに混乱を招くでしょうか?

スクリプト用の小さなレポのはずが、今

答えて

6

チェックこのアウトhttps://help.github.com/articles/remove-sensitive-data :-(サイズは約700Mである。ここでは、彼らはあなたのGitのリポジトリから機密データの削除について書きがありますが、非常によく使用することができますあなたのコミットから大きなファイルを除去すること。

+1

私はこのガイドを以前に使いましたが、コミットを破棄した後はどうなりますか?人々はすでにモンスターコミットを引っ張ってきた。起こりそうなことは、誰かが地元のコミットをしてからプッシュすると、マージが必要なことに気づくでしょう。それで彼らはマージしてプッシュし、モンスターのコミットは再び戻ってくるでしょう。どうすればこれが起こらないようにすることができますか?(質問する人に電子メールを送ることはうまくいかない!) – agentgonzo

+0

不要なファイルを削除したら、.gitignoreファイルに追加することを常にお勧めします。そうすれば、Gitはそれらのファイルの追跡をやめ、再度押すことを防ぎます。 –

+0

Sanhkaは、それらがプッシュされるのを防ぎません - それがコミットされるのを防ぎます。彼らがすでにコミットされているので、プッシュはそれらを元に戻すでしょう。 – agentgonzo

8

混乱を回避するための最も簡単な方法は、サーバーに複数のディスクを与えることです。

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

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

問題は、これがチームの全員が、新しいブランチバージョンにリセットするか、いくつかの深刻な頭痛を危険にさらす必要があります。つまり、SHA1ハッシュが書き換えられています。誰も作業が進行中でなく、トピックブランチを使用しているなら、それはすべて上質で良い。集中化が進んでいる場合や、チームが大規模である場合や、作業中に作業ディレクトリが汚れている場合など、混乱や混乱がなければ、これを行う方法はありません。あなたはかなりの時間をかけて、みんなのローカルを正しく動かすことができます。それはgit filter-branchと書いてあります。あなたが計画を持っていることを確認して、チームがそれを理解し、進行中の重要な作業が失われたり混乱した場合に備えて、ローカルリポジトリをバックアップするようにします。

一つの可能​​な計画は次のようになります。

  1. は、進行中の自分の仕事のパッチを生成するgit diff > ~/my_wipのようなものがチームを取得します。
  2. コミットされているが共有されていない作業のパッチを生成するチームを取得します。git format-patch <branch>
  3. 実行。これが起こっている間、チームが引っ張らないことを知っていることを確認してください。
  4. チームにgit fetch && git reset --hard origin/<branch>を発行するか、リポジトリを新しくクローンしてもらいますか?
  5. git am <patch>で以前にコミットされた作業を適用します。
  6. 進捗状況はgit applyと入力してください。 git apply ~/my_wip。他の回答に加えて
+0

サーバーのディスク容量を増やすことは、実際には家庭で働く人々がブロードバンド接続で数百MBを引き出す必要があるため、理想的なソリューションではありません。私はちょうどフィルタブランチを行い、 "あなたのものは失敗する - ローカルの変更を隠し、パッチとしてエクスポートし、ローカルリポジトリを削除してから再呼び出しする"という大量のメールを送信する必要があるかもしれません。 – agentgonzo

+0

ええ、これは数ヶ月前です。あなたのアイデアは、私の同僚がパッチについて少し悩まされていたことを除いて、私がやったことと多かれ少なかれ正確です。私はそれらのためにそれをやり終えた。それは午後になった。あなたの計画を組み込むための答えを編集し、後で誰かがこの不具合を抱えた場合に備えて、いくつかのコマンドを追加しました。 – Christopher

4

、あなたは「少なくともユーザー(またはを禁じレポで事前に受けるフックの形で、将来の巨大なjarファイルに対していくつかの先制保護を追加することを検討することをお勧めします非管理ユーザー ")が非常に大きなファイル、または*.jarという名前のファイルをプッシュしたり、何が最善のものかは分かりません。

これまでは、特定のコミットIDを禁止するなど、「一時的なブランチに作業を保存してリセットしてからプルしたり、仕事、マイナス巨大なファイル "。

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

0

filter-branchを使用してください!

git filter-branch -f --prune-empty -- --all 
+0

'--index-filter'は本質的に' --tree-filter'と同じことができますが、より高速です。 –

-1

のGforgeの男ここに:

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

は、それからちょうどでそれらのいずれかのファイルを持っていないすべてのコミットをパージします。でも、これは主にGitの問題であると思った、私は二つのことを提供したいと思います:

  1. Starting in GForge 6.3、サイト管理者は、あまりにも多くのディスクを使用しているプロジェクトだけでなく、古いものと孤立したプロジェクトを識別することができます。これにより、フルディスクの状況を避けることができます。特に、チームとプロジェクトが別々にたくさんある場合は特にそうです。
  2. GForgeで簡単にgitフック(一般的にはSCMフック)を実装しています。サイト管理者は任意の数のフックコマンドを設定することができ、プロジェクトレベルの人々はプロジェクトに必要なフックを選択できます。ファイルの特定のタイプ(またはサイズ)を防止するフックを追加すると、この機能に適しています。
関連する問題