2017-10-15 110 views
1

我想只添加修改後的文件。 我想:用git添加特定的列表修改文件add

git status | grep "modified" | cut -d " " -f4 | git add 

git status | grep "modified" | cut -d " " -f4 | xargs git add 

,但它不工作。我應該使用什麼?

回答

2

第一個將不起作用,因爲您不使用xargs。第二個不起作用,因爲cut不起作用 - 查看輸出。

有命令git ls-files --modified它給你一個修改文件的列表,每行一個。如果你沒有在文件名中的空間,只需使用:

git ls-files --modified | xargs git add 

如果你在你的文件名中的空格,使用-z-0選項(確保你的xargs變種支持-0作爲一個選項;它不是萬能的,但標準是與GNU xargs):

git ls-files --modified -z | xargs -0 git add 

在使用git status沒有標誌,你需要確信有在文件名中沒有空格,然後你可以使用:

git status | awk '/[[:space:]]modified:[[:space:]]/{print $2}' | xargs git add 

另外,git status -s給出了更好,更容易解析的輸出格式。您可以使用:

git status -s | sed -n '/^ M/s///p' | xargs git add 

這適用於簡單的情況下,(你在本地修改的文件,它尚未在索引中,這是唯一相關的變化)。您應該從短格式中讀取git status --help的內容,以瞭解您需要如何處理(很多)其他情況。

另請注意,git commit -a將提交所有修改的文件。


我嘗試:git ls-files -o | grep "tests/" | xargs -0 git add,但我得到xargs: argument line too long

-0選項爲xargs需要「行」以空字節結尾。您的git命令不會生成這些命令,因爲您省略了-z選項。您可能忽略了這一點,因爲您擔心中間的grep(它只適用於以換行符結尾的行),但命令行必須自始至終保持一致,可以使用換行符或使用空值作爲文件名分隔符。幸運的是,grep有一個選項--null(適用於GNU和BSD grep; GNU也允許-z,但這對BSD來說意味着不同)來處理這些數據。因此,你應該嘗試之一:

git ls-files -o -z | grep --null "tests/" | xargs -0 git add 

,或者,如果您不擔心空間在文件名:

git ls-files -o | grep "tests/" | xargs git add 
+0

我試試:git ls-files -o | grep「tests /」| xargs -0 git add。但我得到xargs:參數線太長 @Jonathan Leffler – Alex

+0

我想只添加未跟蹤文件。我也嘗試使用z標誌,但它不起作用@Jonathan Leffler – Alex

+0

我很抱歉,但它仍然不起作用。我得到致命pathspec。 @Jonathan Leffer – Alex

相關問題