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

时间:2015-07-20 18:25:55

标签: git git-status

我需要将一堆已更改的文件和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

5 个答案:

答案 0 :(得分:10)

Private Sub pPEMoveValue(sField) 'Moves the old field value down to the comments section automatically Dim sOrigValue As String Dim sCommentValue As String sOrigValue = sField sCommentValue = Nz(mPEComments, "") Me.mPEComments = sCommentValue & vbNewLine & sOrigValue End Sub Private Sub sPEBatCharger_Dirty(Cancel As Integer) pPEMoveValue (Nz(Me.sPEBatCharger.OldValue, "")) End Sub

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

git-status documentation

以下是参考文献的摘录:

  

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

答案 1 :(得分:4)

如果您有未暂停的更改,则可以使用以下命令在与ls -1类似的单列列表中列出所有已触摸的文件:

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

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

这是我用来快速将所有已修改的文件和新文件复制到临时目录的命令,同时保留完整的目录路径(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的建议。

答案 2 :(得分:2)

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

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

此脚本在行的开头搜索M和空格。如果找到它们,则将其移除并打印行。如果找不到它们(即输出不是M odified文件),则不显示输出。

上面命令行的输出应该与您从ls -1获得的输出大致相当 - 即文件列表,没有其他信息。请注意--porcelain以NULL结束文件名,因此如果输出不能按预期运行,则可能需要在脚本或其他管道中处理。 (阅读xargs(1))。

答案 3 :(得分:1)

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

git diff --name-only

git diff --name-status

在--name-status的输出中,状态(A,M,D)和文件路径名由制表符分隔,您可以通过cut命令对其进行解析。

如果你也可以在登台时获取文件列表,可以使用`--cache'选项。

答案 4 :(得分:0)

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

scp `git status --porcelain | cut -c 4-` bb:~/${PWD##*/}