2013-03-05 92 views
14

我有一個巨大的補丁,我想分解成多個邏輯git提交。大量的變化只是簡單地改變變量名稱或函數調用,使得它們可以很容易地用grep定位。如果我可以在索引中添加任何與正則表達式匹配的更改,然後在git gui中進行清理,那麼將爲我節省大量的手動工作。使用git中的正則表達式或某些grep輸出(例如行號),是否有一種逐行更新索引的好方法?Git通過grep/regex添加行索引

我發現a similar question,但我不知道如何從正則表達式類型的搜索構建臨時文件。

+1

一些例子可能會在闡明你想要達到的目標方面發揮很大的作用。 – rvalvik 2013-03-05 22:09:19

回答

-1

xargs是你在找什麼。試試這個:

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

截至管|是搜索所有的文件*您的標準grep命令。選項包括:

  • i - 不區分大小寫
  • r - 遞歸通過目錄
  • l - 文件列表名稱僅

在聲明FILExargs部分是名變量用於grep命令傳遞的每個參數/匹配。然後在適當的地方使用變量輸入所需的命令。

+5

謝謝,但我想添加一個文件的一部分,而不是整個文件。 – FazJaxton 2013-04-18 17:55:14

+0

@FazJaxton,爲此你需要添加一個補丁。 'git add'後面使用'-p'參數,但是我不確定它是如何在xargs中工作的,因爲補丁過程是由你完成的(即選擇應該添加什麼和不應該)。 – RDL 2013-04-18 18:17:42

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 

我對差異使用-U0以避免發生不相關的變化。您可能需要調整此值以適應您的情況。

+0

這對我來說效果不錯,但是,作爲一個說明,如果修改了與正則表達式不匹配的相鄰行,「hunk」並不能提供足夠的粒度。 – arcyqwerty 2014-11-23 23:04:05

+0

我發現一個好方法就是運行第二行然後檢查結果。 'git status -v'用於上演的東西和'git diff'來查看所有沒有上演的東西。然後提交如果所有看起來正確。 – Gerry 2017-08-22 01:45:58

0

更簡單地說,您可以使用git add -p並利用/選項搜索您的差異以找到要添加的修補程序。它不是完全自動化的,但比我找到的其他替代品更容易。