12

我需要将一堆已更改的文件放入scp不同的盒子进行测试。我很难弄清楚如何git status给我一个列表,ls -1这样我就可以用最小的努力编写动作脚本。

我有一个现有的脚本,可以使用ls -1. 我不是一个有天赋的脚本编写者,所以我不想修改脚本。相反,我希望该工具能够修改其输出。

显然,git status -1没有奏效。How can I get 'git status' to always use short format中的格式与我的脚本不兼容。并git status --column产生了与下面相同的结果。

我如何git status列出修改后的文件,一个到一行,只有修改后的文件在一行上?


$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 2 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   cryptest.vcproj
    modified:   dlltest.vcproj

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   adler32.cpp
    modified:   algebra.cpp
    modified:   algparam.cpp
    modified:   asn.cpp
    modified:   asn.h
    modified:   authenc.cpp
    modified:   authenc.h
    modified:   basecode.cpp
    modified:   cast.cpp
    modified:   ccm.cpp
    modified:   cmac.cpp
    modified:   config.h
    modified:   cryptdll.vcproj
    modified:   cryptlib.cpp
    modified:   cryptlib.h
    modified:   cryptlib.vcproj
    modified:   datatest.cpp
    modified:   dlltest.cpp
    modified:   eax.cpp
    modified:   ec2n.cpp
    modified:   eccrypto.cpp
    modified:   ecp.cpp
    modified:   emsa2.cpp
    modified:   eprecomp.cpp
    modified:   esign.cpp
    modified:   files.cpp
    modified:   filters.cpp
    modified:   filters.h
    modified:   fips140.cpp
    modified:   fipsalgt.cpp
    modified:   fltrimpl.h
    modified:   gf2_32.cpp
    modified:   gf2n.cpp
    modified:   gf2n.h
    modified:   gfpcrypt.cpp
    modified:   gfpcrypt.h
    modified:   hkdf.h
    modified:   hmac.cpp
    modified:   hrtimer.cpp
    modified:   ida.cpp
    modified:   idea.cpp
    modified:   integer.cpp
    modified:   iterhash.cpp
    modified:   luc.h
    modified:   misc.cpp
    modified:   misc.h
    modified:   modes.cpp
    modified:   modes.h
    modified:   nbtheory.cpp
    modified:   network.cpp
    modified:   oaep.cpp
    modified:   panama.cpp
    modified:   pkcspad.cpp
    modified:   polynomi.cpp
    modified:   pssr.cpp
    modified:   pubkey.h
    modified:   pwdbased.h
    modified:   queue.cpp
    modified:   rijndael.cpp
    modified:   rsa.cpp
    modified:   rw.cpp
    modified:   salsa.cpp
    modified:   seal.cpp
    modified:   secblock.h
    modified:   simple.h
    modified:   smartptr.h
    modified:   socketft.cpp
    modified:   socketft.h
    modified:   sosemanuk.cpp
    modified:   strciphr.cpp
    modified:   strciphr.h
    modified:   test.cpp
    modified:   validat1.cpp
    modified:   validat2.cpp
    modified:   vmac.cpp
    modified:   wait.cpp
    modified:   winpipes.cpp
    modified:   winpipes.h
    modified:   words.h
    modified:   xtr.cpp
    modified:   xtr.h
    modified:   zdeflate.cpp
    modified:   zinflate.cpp
4

5 回答 5

11

git status --porcelain

这将以短格式输出,但在所有版本的 Git 中都是一致的。

git 状态文档

以下是参考资料的摘录:

--porcelain
易于解析的格式为脚本提供输出。这与短输出类似,但在 Git 版本之间以及无论用户配置如何都将保持稳定。

于 2015-07-20T18:30:47.210 回答
6

如果您有未暂存的更改,您可以在类似于ls -1使用此命令的单列列表中列出所有涉及的文件:

git ls-files --modified --others --exclude-standard --directory

--modified选项显示修改后的文件,该--others选项显示其他未跟踪的文件,例如新文件;--exclude-standard忽略排除的文件并--directory仅列出目录名称而不是其中的文件。有关详细信息,请参阅文档

这是我用来快速将所有修改过的文件和新文件复制到我的临时目录的命令,同时保留完整的目录路径(一个肮脏的替代方案git stash):

git ls-files --modified --others --exclude-standard --directory | xargs -I {} cp --parents {} ~/temp

如果您已经将要提交的文件添加到 git(例如,git add -A .),那么您可以使用接受的答案中的命令并提取第二列以获取您的纯文件列表:

git status --porcelain | awk '{ print $2 }'

如果要按 git status 过滤行,则可以执行以下操作:

git status --porcelain | grep ^[AM] | awk '{ print $2 }'

这为您提供了一个仅包含已修改 ( M) 和新添加 ( A) 文件的列表。


更新:

  • 添加了@jotik 的建议。
于 2016-03-08T10:40:23.053 回答
3

正如托马斯所建议的那样,--porcelain选项就是您想要的。但当然,要获得修改文件的文件名,您还需要解析该输出。例如,通过这样的简单 sed 脚本管道输出可能会起作用:

git status --porcelain | sed -ne '/^M  */s///p'

M此脚本在行首搜索 a和空格。如果找到它们,则将它们删除并打印该行。如果未找到它们(即输出不是经过M修改的文件),则不显示任何输出。

上面命令行的输出应该和你得到的差不多ls -1——也就是说,一个文件列表,没有其他信息。请注意,--porcelain以 NULL 终止文件名,因此如果输出未按预期运行,您可能需要在脚本或另一个管道中处理它。(阅读有关xargs(1))。

于 2015-07-20T18:40:43.997 回答
3

对于修改后的文件列表,以下命令可以提供帮助。

git diff --name-only

或者

git diff --name-status

int --name-status 的输出,status(A, M, D) 和文件路径名用tab分隔,可以通过cut命令解析。

如果您也可以在暂存时获取文件列表,则可以使用 `--cache' 选项。

于 2016-03-09T06:11:10.460 回答
0

要检测更改的文件并将scp它们直接发送到远程服务器:

scp `git status --porcelain | cut -c 4-` bb:~/${PWD##*/}
于 2018-07-06T07:23:15.427 回答