"git status"的简短或短格式如"ls -1"?

jww*_*jww 9 git git-status

我需要将一堆已更改的文件和scp它们放到不同的盒子中进行测试.我无法弄清楚如何制作git status一个像ls -1我这样的列表,我可以用最小的努力编写脚本.

我有一个现有的脚本,可以满足我的需要ls -1.我不是一个有天赋的脚本,所以我不想修改脚本.相反,我希望该工具修改其输出.

显然,git status -1没有奏效.在格式怎样才能"git的状态"始终使用短格式不符合我的脚本兼容.并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
Run Code Online (Sandbox Code Playgroud)

Tho*_*ger 11

git status --porcelain

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

git-status文档

以下是参考文献的摘录:

--porcelain
易于解析的格式为脚本提供输出.这类似于短输出,但在Git版本中保持稳定,无论用户配置如何.


thd*_*oan 5

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

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

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

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

git ls-files --modified --others --exclude-standard --directory | xargs -I {} cp --parents {} ~/temp
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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


更新:

  • 添加了@jotik的建议。