我想只添加修改过的文件。 我试过了:
git status | grep "modified" | cut -d " " -f4 | git add
或
git status | grep "modified" | cut -d " " -f4 | xargs git add
但它不起作用。我该怎么用?
答案 0 :(得分:2)
第一个赢了,因为你没有使用xargs
。第二个不起作用,因为cut
不起作用 - 查看输出。
命令git ls-files --modified
为您提供了修改过的文件列表,每行一个。如果您的文件名中没有空格,只需使用:
git ls-files --modified | xargs git add
如果文件名中有空格,请使用-z
和-0
选项(确保xargs
的变体支持-0
作为选项;它不是&# 39; t通用,但是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
的spiel,以了解如何处理(许多)其他案例。
另请注意,git commit -a
将提交所有已修改的文件。
我尝试:
git ls-files -o | grep "tests/" | xargs -0 git add
,但我得到xargs: argument line too long
。
-0
的{{1}}选项需要'行'以null字节结尾。由于您省略了xargs
选项,因此git
命令无法生成这些命令。您可能忽略了这一点,因为您担心中间的-z
(仅适用于以换行符结尾的行),但您的命令行必须从头到尾自我一致,或者使用换行符或使用空值作为文件名分隔符。幸运的是,grep
有一个选项grep
(适用于GNU和BSD --null
; GNU也允许grep
,但这意味着在BSD上有不同的东西来处理这些数据。因此,您应该尝试:
-z
或者,如果您不必担心文件名中的空格:
git ls-files -o -z | grep --null "tests/" | xargs -0 git add
答案 1 :(得分:1)
您只需使用git add -u
即可。 It will stage only modified files