2013-03-05 6 views
14

私は、複数の論理gitコミットに分割したいという巨大なパッチがあります。変数の名前や関数呼び出しを変更するだけで、grepを簡単に見つけることができます。正規表現と一致する変更をインデックスに追加してgit guiをクリーンアップすることができれば、私は多くの手作業を省くことができます。 git内の正規表現やgrepの出力(行番号など)を使用して、行単位でインデックスを更新する良い方法はありますか?Gitはgrep/regexによってインデックスに行を追加します

私はa similar questionを見つけましたが、正規表現型検索から一時ファイルを作成する方法がわかりません。

+1

いくつかの例は、達成しようとしていることを明確にするために、おそらく長い道のりになります。 – rvalvik

答えて

-1

xargsはあなたが探しているものです。これを試してみてください:

grep -irl 'regex_term_to_find' * | xargs -I FILE git add FILE 

最大パイプ|にすべてのファイル*を検索するための標準のgrepコマンドです。オプションは次のとおりです。

  • i - 大文字小文字を区別しない
  • r - ディレクトリを再帰的
  • l - のファイルのリスト名のみ声明FILExargs一部で

がある名前grepコマンドによって渡された各引数/マッチで使用する変数。必要に応じて変数を使用して、目的のコマンドを入力します。

+5

ありがとうございますが、ファイル全体ではなく、ファイルの一部だけを追加したいと思います。 – FazJaxton

+0

@FazJaxton、そのためにはパッチとして追加する必要があります。 'git add'の後に' -p'パラメータを使用してください。しかし、パッチプロセスがあなたによって行われたとき(つまり、何を追加すべきか、何をすべきでないのかを選択する)xargsの中でどのように動作するのか分かりません。 – RDL

13

patchutilsには、これを達成するために使用できるコマンドgrepdiffがあります。

# check that the regex search correctly matches the changes you want. 
git diff -U0 | grepdiff 'regex search' --output-matching=hunk 

# then apply the changes to the index 
git diff -U0 | grepdiff 'regex search' --output-matching=hunk | git apply --cached --unidiff-zero 

diffには-U0を使用して、関連のない変更を避けます。あなたの状況に合わせてこの値を調整したいかもしれません。

+0

これはかなりうまくいきましたが、正規表現と一致しない隣接行を修正した場合、 'hunk'は十分な細分性を提供しません。 – arcyqwerty

+0

私は良い方法は、2番目の行を実行して、結果を確認することです。 'git status -v'はステージングされたもの、' git diff'はステージングされなかったものすべてを表示します。すべて正しいと思われる場合はコミットします。 – Gerry

0

さらに簡単に言えば、git add -pを使用して/オプションを使用して、追加するパッチをdiffで検索できます。それは完全に自動化されていませんが、私が見つけた他の選択肢よりも簡単です。

関連する問題