英語フランス語スペイン語

OnWorksファビコン

git-filter-branch - クラウドでオンライン

Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターを介して、OnWorks の無料ホスティング プロバイダーで git-filter-branch を実行します。

これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド git-filter-branch です。

プログラム:

NAME


git-filter-branch - ブランチを書き換える

SYNOPSIS


git フィルターブランチ [--env-フィルター] [--ツリーフィルター]
[--インデックスフィルター] [--親フィルター]
[--msg-フィルター] [--コミットフィルター]
[--タグ名フィルター] [--サブディレクトリフィルター]
[--プルーン-空]
[ - オリジナル] [-d ] [-f | - 力]
[--] [ ...]

DESCRIPTION


で言及されているブランチを書き換えることで、Git リビジョン履歴を書き換えることができます。
options> を使用して、各リビジョンにカスタム フィルターを適用します。 これらのフィルターは各ツリーを変更できます
(例: ファイルを削除するか、すべてのファイルに対して Perl リライトを実行する)、またはそれぞれに関する情報
専念。 それ以外の場合は、すべての情報 (元のコミット時間またはマージ情報を含む)
保存されます。

このコマンドは、 正の コマンドラインで言及されている refs (たとえば、
パス a.b、のみ b 書き換えられます)。 フィルターを指定しない場合、コミットは次のようになります。
変更を加えずに再コミットされますが、通常は効果がありません。 それにもかかわらず、これは
将来、Git のバグなどを補うために役立つ可能性があるため、そのような
使用が許可されています。

注意: このコマンドは、.git/info/grafts ファイルと refs/replace/ 名前空間内の ref を尊重します。
グラフトまたは置換参照が定義されている場合、このコマンドを実行すると、それらが定義されます。
永久的。

警告! 書き換えられた履歴では、すべてのオブジェクトのオブジェクト名が異なります。
元のブランチとは収束しません。 簡単に押すことはできなくなります
書き換えられたブランチを元のブランチの上に配布します。 これは使用しないでください
完全な意味がわからない場合はコマンドを使用し、単純な場合はとにかく使用しないでください。
問題を解決するには単一のコミットで十分です。 (「上流からの回復」を参照)
「REBASE」セクション git-リベース(1) 公開されたリライトの詳細については、
歴史。)

書き換えられたバージョンが正しいことを常に確認してください: 元の参照 (異なる場合)
書き換えられたものは名前空間に保存されます 参照/オリジナル/.

この操作は I/O 負荷が非常に高いため、リダイレクトすることをお勧めします。
オフディスクの一時ディレクトリ -d たとえば tmpfs のオプション。 スピードアップしたとの報道
非常に目立ちます。

フィルタ
フィルターは以下の順序で適用されます。 の引数は常に
を使用してシェルコンテキストで評価されます。 評価する コマンド (注目すべき例外を除く)
技術的な理由によりコミットフィルター)。 その前に、$GIT_COMMIT 環境変数
書き換えられるコミットの ID を含むように設定されます。 また、GIT_AUTHOR_NAME、
GIT_AUTHOR_EMAIL、GIT_AUTHOR_DATE、GIT_COMMITTER_NAME、GIT_COMMITTER_EMAIL、および
GIT_COMMITTER_DATE は現在のコミットから取得され、環境にエクスポートされます。
によって作成された置換コミットの作成者およびコミッターの ID に影響を与えるため
git コミット ツリー(1) フィルターの実行後。

何らかの評価があれば、 ゼロ以外の終了ステータスを返すと、操作全体が次のようになります。
中止されました。

A 地図 「オリジナル sha1 id」引数を受け取り、
コミットがすでに書き換えられている場合は「rewrite sha1 id」、「original sha1 id」
さもないと; の 地図 コミットフィルターの場合、関数は複数の ID を別々の行に返すことができます。
複数のコミットを発行しました。

OPTIONS


--env-フィルター
このフィルターは、コミットが実行される環境を変更する必要がある場合にのみ使用できます。
が実行されます。 具体的には、作成者/コミッターを書き換えるとよいでしょう。
name/email/time 環境変数 (「 git コミット ツリー詳細は(1)を参照)。 しない
変数を再エクスポートするのを忘れてください。

--ツリーフィルター
ツリーとその内容を書き換えるためのフィルターです。 引数が評価される
シェル内で作業ディレクトリをチェックアウトしたツリーのルートに設定します。 新しい
ツリーはそのまま使用されます (新しいファイルは自動追加され、消えたファイルは自動削除されます)
- .gitignore ファイルも他の無視ルールもありません HAVE ANY 効果!)

--インデックスフィルター
インデックスを書き換えるためのフィルターです。 ツリーフィルターに似ていますが、
ツリーをチェックアウトしないので、はるかに高速になります。 git rm とともによく使用されます
--cached --ignore-unmatch ...、以下の例を参照してください。 毛深いケースについては、を参照してください。 git-更新-
indexとします。

--親フィルター
これはコミットの親リストを書き換えるためのフィルターです。 親を受け取ります
文字列を標準入力に格納し、新しい親文字列を標準出力に出力します。 親文字列は
で説明されている形式で git コミット ツリー(1): 初期コミットの場合は空、「-p」
通常のコミットの場合は「parent」、マージの場合は「-pparent1 -pparent2 -pparent3 ...」
コミット。

--msg-フィルター
コミットメッセージを書き換えるためのフィルターです。 引数は次のように評価されます。
標準入力に元のコミットメッセージを含むシェル。 その標準出力が使用されます
新しいコミットメッセージとして。

--コミットフィルター
コミットを行うためのフィルターです。 このフィルターを指定すると、
の代わりに呼び出されました git コミットツリー コマンド。「」形式の引数を指定します。
[(-p )...]" と標準入力のログ メッセージ。コミット ID が必要です。
標準出力上で。

特別な拡張機能として、コミット フィルターは複数のコミット ID を発行できます。 その場合、
元のコミットの書き換えられた子は、そのすべてを親として持ちます。

あなたが使用することができます 地図 このフィルタの便利な関数、およびその他の便利な機能
機能も。 たとえば、電話をかけると、 スキップ_コミット 「$ @」 現在のものは省略します
commit (ただし、変更は行いません! それが必要な場合は、次を使用してください) git リベース 代わりに)。

次の場合は、 git commit-tree "$@" の代わりに git_commit_non_empty_tree "$@" を使用することもできます。
単一の親とのコミットを保持したくない場合は、
ツリー。

--タグ名フィルター
タグ名を書き換えるためのフィルターです。 渡されると、次のたびに呼び出されます。
書き換えられたオブジェクト (または、
書き換えられたオブジェクト)。 元のタグ名は標準入力経由で渡され、新しいタグは
名前は標準出力に期待されます。

元のタグは削除されませんが、上書きされる可能性があります。 「--tag-name-filter cat」を使用します
タグを更新するだけです。 この場合、細心の注意を払って、次のものがあることを確認してください。
変換に問題があった場合に備えて、古いタグがバックアップされます。

タグ オブジェクトのほぼ適切な書き換えがサポートされています。 タグにメッセージがある場合
添付すると、同じメッセージ、作成者、および同じタグを持つ新しいタグ オブジェクトが作成されます。
タイムスタンプ。 タグに署名が付いている場合、署名は剥がされます。 それは
定義上、署名を保存することは不可能です。 これが「ほぼ」適切である理由は、
理想的には、タグが変更されていない(同じオブジェクトを指し、同じオブジェクトを持っている)場合であるためです。
名前など)署名を保持する必要があります。 そうではありません。署名は
常に削除されます、購入者は注意してください。 また、作成者やユーザーの変更もサポートされていません。
タイムスタンプ (またはタグメッセージ)。 他のタグを指すタグは、
基礎となるコミットを指すように書き換えられました。

--サブディレクトリフィルター
指定されたサブディレクトリに関連する履歴のみを確認します。 結果には以下が含まれます
そのディレクトリ (およびそれだけ) をプロジェクトのルートとして指定します。 「リマップ」というセクションを意味します。
ご先祖様へ。」

--プルーン-空
ある種のフィルターは空のコミットを生成し、ツリーはそのまま残ります。 これ
スイッチを使用すると、git-filter-branch がそのようなコミットを無視できるようになります。 ただし、このスイッチのみ
親が XNUMX つだけあるコミットに適用されるため、マージが維持されます
ポイント。 また、このオプションは、 --コミットフィルター。 しかし
関数を使用するだけです git_commit_non_empty_tree 「$ @」 gitの代わりに
これを実現するには、コミット フィルター内の commit-tree "$@" イディオムを使用します。

- オリジナル
このオプションを使用して、元のコミットが保存される名前空間を設定します。 の
デフォルト値は refs / original.

-d
このオプションを使用して、書き換えに使用される一時ディレクトリへのパスを設定します。 いつ
ツリー フィルターを適用する場合、コマンドはツリーを一時的にチェックアウトする必要があります。
大規模なプロジェクトの場合、かなりのスペースを消費する可能性があります。 デフォルトでは
これを行うのは .git-rewrite/ ディレクトリですが、これによってその選択をオーバーライドできます
パラメータに一致する最初のデバイスのリモートコントロール URL を返します。

-f、-force
git フィルターブランチ 既存の一時ディレクトリから開始することを拒否するか、一時ディレクトリが存在する場合
はすでに次で始まる参照です 参照/オリジナル/、強制されない限り。

...
の引数 git リビジョンリスト。 これらのオプションに含まれるすべての正の参照が書き換えられます。
次のようなオプションを指定することもできます。 - すべて、ただし、使用する必要があります -- それらを分離するために
  git フィルターブランチ オプション。 「祖先への再マップ」というセクションを意味します。

リマップ 〜へ 祖先
使用することにより、 リビジョンリスト(1) 引数 (例: パス リミッター)。リビジョンのセットを制限できます。
書き換えられます。 ただし、コマンドライン上の正の参照は区別されます。
そのようなリミッターによって彼らを排除しないでください。 この目的のために、代わりに書き換えられます
除外されなかった最も近い祖先を指します。


ファイル (機密情報や著作権を含む) を削除したいとします。
違反) すべてのコミットから:

git filter-branch --tree-filter 'rm ファイル名' HEAD

ただし、ファイルが何らかのコミットのツリーに存在しない場合、単純な rm ファイル名は
そのツリーでは失敗し、コミットします。 したがって、代わりに rm -f filename を使用することもできます。
スクリプト。

--index-filter を使用した場合 git rm 大幅に高速なバージョンが生成されます。 rm を使用する場合と同様
filename, git rm --cached filename は、ファイルがツリーに存在しない場合は失敗します。
専念。 ファイルを「完全に忘れたい」場合は、ファイルがいつ入力されたかは関係ありません
履歴があるため、 --ignore-unmatch も追加します。

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

これで、HEADに保存された書き換え履歴が得られます。

foodir/ がプロジェクト ルートであるかのようにリポジトリを書き換え、すべてを破棄するには
その他の歴史:

git filter-branch --subdirectory-filter foodir -- --all

したがって、たとえば、ライブラリのサブディレクトリを独自のリポジトリに変えることができます。 -- に注意してください
分離する フィルターブランチ リビジョン オプションのオプション、およびすべてを書き換える --all
ブランチとタグ。

コミット (通常は別の履歴の先頭にあります) をその親となるように設定するには
現在の履歴の後ろに他の履歴を貼り付けるには、現在の初期コミットを実行します。

git filter-branch --parent-filter 'sed "s/^\$/-p /"' 頭

(親文字列が空の場合 - これは、最初のコミットを処理するときに発生します
- gratcommit を親として追加します)。 これは、単一のルート (つまり、
つまり、共通の祖先がなければマージは行われません)。 そうでない場合は、次を使用します。

git filter-branch --parent-filter \
'テスト $GIT_COMMIT = && エコー "-p " || 猫の頭

またはさらに単純です:

echo "$commit-id $graft-id" >> .git/info/grafts
git フィルターブランチ $graft-id..HEAD

「Darl McBribe」によって作成されたコミットを履歴から削除するには:

git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_NAME" = "ダール・マクブライブ" ];
その後
スキップ_コミット "$@";
ほかに
git コミットツリー "$@";
ファイヘッド

関数 スキップ_コミット は次のように定義されます。

スキップ_コミット()
{
シフト;
while [ -n "$1" ];
do
シフト;
マップ「$1」;
シフト;
終わり;
}

シフト マジックは最初にツリー ID を破棄し、次に -p パラメータを破棄します。 これに注意してください
マージを適切に処理します。 Darl が P1 と P2 の間のマージをコミットした場合、次のようになります。
適切に伝播され、マージのすべての子は P1、P2 を持つマージ コミットになります。
マージコミットの代わりに親を使用します。

注意 コミットによって導入され、後続のコミットによって元に戻されない変更
コミットは書き換えられたブランチに残ります。 捨てたいなら 変更 一緒に
コミットでは、対話型モードを使用する必要があります。 git リベース.

--msg-filter を使用してコミット ログ メッセージを書き換えることができます。 例えば、 git svn-id
によって作成されたリポジトリ内の文字列 git SVN この方法で削除できます:

git フィルターブランチ --msg-filter '
sed -e "/^git-svn-id:/d"
'

追加する必要がある場合 承認者 たとえば、最後の 10 コミットまでの行 (どれもマージではありません)、
このコマンドを使用します。

git フィルターブランチ --msg-filter '
猫 &&
echo "承認者: バッグス バニー[メール保護]>"
' 頭~10..頭

--env-filter オプションを使用すると、コミッターや作成者の ID を変更できます。 ために
たとえば、設定ミスによりコミットの ID が間違っていることが判明した場合
user.email は、プロジェクトを公開する前に次のように修正できます。

git filter-branch --env-filter '
テストの場合 "$GIT_AUTHOR_EMAIL" = "root@localhost"
その後
GIT_AUTHOR_EMAIL=[メール保護]
GIT_AUTHOR_EMAIL をエクスポートする
fi
テストの場合 "$GIT_COMMITTER_EMAIL" = "root@localhost"
その後
GIT_COMMITTER_EMAIL=[メール保護]
GIT_COMMITTER_EMAIL をエクスポートする
fi
' - - 全て

履歴の一部のみに書き換えを制限するには、履歴に加えてリビジョン範囲を指定します。
新しいブランチ名。 新しいブランチ名は、ブランチの最上位のリビジョンを指します。 git
リビジョンリスト この範囲のものが印刷されます。

この歴史を考えてみましょう。

D--E--F--G--H
/ /
A--B-----C

コミット D、E、F、G、H のみを書き換えて、A、B、および C をそのままにするには、次を使用します。

git フィルターブランチ ... C..H

コミット E、F、G、H を書き換えるには、次のいずれかを使用します。

git filter-branch ... C..H --D ではない
git filter-branch ... D..H --C ではありません

ツリー全体をサブディレクトリに移動するか、そこから削除するには:

git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&newsubdir/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD

チェックリスト FOR 収縮 A リポジトリ


git-filter-branch を使用すると、通常はいくつかのファイルを含むファイルのサブセットを削除できます。
--index-filter と --subdirectory-filter の組み合わせ。 人々は結果を期待します
リポジトリは元のリポジトリよりも小さくする必要がありますが、実際に作成するにはさらにいくつかの手順が必要です
Git は、指示があるまでオブジェクトを失わないよう努めるため、サイズが小さくなります。 初め
次のことを確認してください。

· BLOB が存続期間中に移動された場合、ファイル名のすべてのバリアントが実際に削除されました。
git log --name-only --follow --all -- filename は、名前の変更を見つけるのに役立ちます。

· すべての参照を実際にフィルタリングしました。呼び出し時に --tag-name-filter cat -- --all を使用します。
git フィルター ブランチ。

次に、より小さいリポジトリを取得するには XNUMX つの方法があります。 より安全な方法はクローンを作成することです。
オリジナルをそのままに。

· git clone file:///path/to/repo でクローンを作成します。 クローンには削除されません
オブジェクト。 見る gitクローン(1)。 (プレーンパスを使用したクローン作成はハードリンクするだけであることに注意してください
すべての!)

何らかの理由でどうしてもクローンを作成したくない場合は、次の点を確認してください。
代わりに(この順序で)。 これは非常に破壊的なアプローチですので、 make a バックアップ または戻る
クローンを作成します。 あなたは警告を受けました。

· git-filter-branch によってバックアップされた元の参照を削除します: git for-each-ref とします。
--format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d。

· git reflogexpire --expire=now --all を使用して、すべての reflog を期限切れにします。

· git gc --prune=now を使用してすべての未参照オブジェクトをガベージ コレクションします (または、git-gc が
--prune の引数をサポートできるほど新しいものではないので、 git repack -ad を使用してください。 gitプルーン
代わりに)。

注意事項


git-filter-branch を使用すると、Git 履歴をシェルスクリプトで複雑に書き換えることができます。
しかし、単に次のような場合には、おそらくこの柔軟性は必要ありません。 除去 不要な データ ような
大きなファイルやパスワード。 これらの操作については、検討する必要があるかもしれません この BFG
リポクリーナー[1]、git-filter-branch の JVM ベースの代替品、通常は少なくとも 10 ~ 50x
これらのユースケースではより高速であり、まったく異なる特性を備えています。

· ファイルの特定のバージョンは正確にクリーンアップされます かつて。 BFGとは異なり、
git-filter-branch では、ファイルを別の方法で処理する機会が与えられません。
履歴内のどこで、いつコミットされたかに基づいて。 この制約により、
BFG の核となるパフォーマンス上のメリットがあり、悪いものをクレンジングするタスクに適しています。
データ - 気にしないでください コラボレー 悪いデータは、あなたがそれを求めているだけです 行って.

· デフォルトでは、BFG はマルチコア マシンを最大限に活用し、コミットをクレンジングします。
ファイルツリーを並行して実行します。 git-filter-branch はコミットを順番にクリーンアップします (つまり、
シングルスレッド方式)、ただし is 独自のフィルターを含むフィルターを作成することが可能
各コミットに対して実行されるスクリプトの並列処理。

command オプション[2] git-filter ブランチよりもはるかに制限が厳しく、専用です
不要なデータを削除するタスクのみに適用されます。例: --strip-blobs-bigger-than 1M。

GIT


の一部 git(1)スイート

注意事項


1. BFG リポクリーナー
http://rtyley.github.io/bfg-repo-cleaner/

2. コマンドオプション
http://rtyley.github.io/bfg-repo-cleaner/#例

onworks.net サービスを使用してオンラインで git-filter-branch を使用する


無料のサーバーとワークステーション

Windows と Linux のアプリをダウンロード

Linuxコマンド

Ad