V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
AndyAO
V2EX  ›  问与答

如何在 PowerShell 中捕获到 git 命令中返回的全部信息?

  •  1
     
  •   AndyAO · 2021-05-31 09:09:40 +08:00 · 1371 次点击
    这是一个创建于 1301 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如,git log 可能返回这样的信息

    PS> git log
    
    commit ed231a0a0923bd8b601e51e40b5249a56e78674a (HEAD -> master, tag: s2)
    Author: fibo
    Date:   Mon May 31 08:52:41 2021 +0800
    
        r2 mes
    

    使用 PowerShell 捕获这个命令中产生的所有流,但中括号内的内容还是丢失掉了。

    PS> Out-String -InputObject ((git log) *>&1)
    
    commit 37aa5208e2d9b78d42bdc649c3c0fa0f2de6c1e0
    Author: fibo
    Date:   Mon May 31 08:56:53 2021 +0800
    
        r2 mes
    

    在 PowerShell 中如何捕获这些信息?

    15 条回复    2021-06-07 14:16:16 +08:00
    oaix
        1
    oaix  
       2021-05-31 09:28:44 +08:00
    git log --decorate=full
    iovekkk
        2
    iovekkk  
       2021-05-31 09:33:16 +08:00
    图形化界面不好吗?
    用 sourcetree 好多年了
    对 git flow 的支持很赞
    oaix
        3
    oaix  
       2021-05-31 09:33:33 +08:00   ❤️ 1
    https://git-scm.com/docs/git-log

    --decorate[=short|full|auto|no]
    Print out the ref names of any commits that are shown. If short is specified, the ref name prefixes refs/heads/, refs/tags/ and refs/remotes/ will not be printed. If full is specified, the full ref name (including prefix) will be printed. If auto is specified, then if the output is going to a terminal, the ref names are shown as if short were given, otherwise no ref names are shown. The default option is short.
    AndyAO
        4
    AndyAO  
    OP
       2021-05-31 09:44:13 +08:00
    @oaix #3
    有个地方不太明白,默认的选项是 short,这个是没错的。

    但是如果显式使用 git log --decorate=short 那么其中的信息是可以被 PowerShell 捕获的;反之,如果不显式使用,则信息可以被看到,但不能被捕获到变量当中去进行下一步的处理。

    这是为什么呢?
    oaix
        5
    oaix  
       2021-05-31 09:51:31 +08:00
    @AndyAO #4 好问题,这里我也不知道原因,感觉是文档有问题,实际默认值是 auto 。
    oaix
        6
    oaix  
       2021-05-31 09:57:52 +08:00
    理解文档的意思了,默认值的意思是:--decorate 等效于--decorate=short
    AndyAO
        7
    AndyAO  
    OP
       2021-05-31 10:12:08 +08:00
    现在感觉之所以在 Shell 中获取不到信息,是因为文档上有写到

    If auto is specified, then if the output is going to a terminal

    那么,如果值为 auto 这些信息会直接输出到终端,而不是 Shell 当然这只是个猜测,我不确定。
    slipper
        8
    slipper  
       2021-05-31 10:22:35 +08:00
    git log --no-color -1 | awk '{print $0}' OK 嘛
    slipper
        9
    slipper  
       2021-05-31 10:26:09 +08:00
    还是你想要所有提交信息 git log --no-color | awk '{print $0}'
    jeffreystoke
        10
    jeffreystoke  
       2021-05-31 12:55:36 +08:00   ❤️ 1
    @AndyAO 设置为 auto 会让 git log 先判断 stdout 是不是 tty, 如果是 tty 才会输出 `(HEAD -> master, tag: s2)`
    AndyAO
        11
    AndyAO  
    OP
       2021-06-07 10:52:49 +08:00
    @oaix 你的最初判断是没有错的,的确是文档有问题,我向开发人员提交了 Pull Request,今天收到了邮件通知这个 Pull Request 已经被接受了。

    https://cdn.jsdelivr.net/gh/Andy-AO/GitHubPictureBed/img/20210607105156.png

    感觉我对这类著名开源项目的可靠性有了过高的估计,很多细节其实有不少的错误,从 Pull Request 列表中就可以看出来。
    oaix
        12
    oaix  
       2021-06-07 11:19:32 +08:00
    @AndyAO 👍
    oaix
        13
    oaix  
       2021-06-07 11:35:26 +08:00   ❤️ 1
    @AndyAO 看了下这个 PR 的讨论,如他们所说,这里面有 2 个默认值的概念,1:如果没有传 --decorate,那么默认值就是 auto ; 2:如果传了 --decorate,但没有指定 decorate 的值,那么默认值就是 short 。很明显,当前文档说的是情况 2,但其实情况 1 更符合直觉(如你的 PR 所修改的),如果能更进一步,在文档里面把这两个地方都说清楚可能更棒。
    AndyAO
        14
    AndyAO  
    OP
       2021-06-07 14:13:34 +08:00
    @oaix 原来是这样,其实后面的讨论没来得及看。

    可能是因为第 1 次参与这种邮件列表讨论,需要注意的地方太多,花了很长时间才把信息给发出去,感觉很累,后来看到了相关的后续讨论,也就没有兴趣了。

    如果不是你提醒的话,还不清楚「存在两个默认值」这个情况。谢谢。
    AndyAO
        15
    AndyAO  
    OP
       2021-06-07 14:16:16 +08:00
    感觉邮件列表上的讨论还是比较轻松的,对于这个不太起眼的 GitHub 的 Pull Request,维护者也发言了,后来我会用邮件列表了,在这里面发了个比较普通的问题,他也是第 1 个回复的,没想到他的时间还挺宽裕的,对于这些问题还来评论评论。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2513 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:57 · PVG 10:57 · LAX 18:57 · JFK 21:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.