2017-10-15 138 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

相关问题