来自<(git log --oneline)的读取循环与终端

时间:2017-11-24 23:01:47

标签: git bash cygwin parentheses

我遇到了一个奇怪的问题。我正在尝试解析git命令的输出。当我从命令行运行git命令时,它按预期工作:

$ git log --oneline 32004f
32004f9 (tag: This_is_a_tag,_too, tag: Tag_from_command_line, origin/Project_A, Project_A) Merged
65f6f61 More changes
925f619 (tag: This_is_a_tag) Pulled from remote
(etc.)

但是一旦我尝试重定向或管道输出,括号内的任何内容都会消失:

$ while read -r ; do echo $REPLY; done < <(git log --oneline 32004f)
32004f9 Merged
65f6f61 More changes
925f619 Pulled from remote

[编辑:请注意,严格使用echo命令来说明问题。实际的脚本会将结果拆分为多个变量,以便进行解析和处理]

$ git log --oneline 32004f | hexdump -C | head
00000000  33 32 30 30 34 66 39 20  4d 65 72 67 65 64 0a 36  |32004f9 Merged.6|
00000010  35 66 36 66 36 31 20 4d  6f 72 65 20 63 68 61 6e  |5f6f61 More chan|
00000020  67 65 73 0a 39 32 35 66  36 31 39 20 50 75 6c 6c  |ges.925f619 Pull|
00000030  65 64 20 66 72 6f 6d 20  72 65 6d 6f 74 65 0a 64  |ed from remote.d|

但是我掀起的快速shell脚本与括号相呼应,效果很好:

$ cat test.sh
#!/bin/bash
echo "32004f9  (HEAD -> Project_A, tag: This_is_a_tag,_too, tag: Tag_from_command_line, origin /Project_A) Merged"

$ while read -r ; do echo $REPLY; done < <(./test.sh)
32004f9 (HEAD -> Project_A, tag: This_is_a_tag,_too, tag: Tag_from_command_line, origin /Project_A) Merged

我很难过。任何人都可以帮我这个吗?

Bash版本:GNU bash,版本4.4.12(3)-release(i686-pc-cygwin) git版本:git版本2.15.0

1 个答案:

答案 0 :(得分:3)

检查--decorate的{​​{1}}选项:

  

git log

     

打印出所有提交的引用名称。如果指定了--no-decorate, --decorate[=short|full|auto|no],则不会打印引用名称前缀shortrefs/heads/refs/tags/。如果指定了refs/remotes/,则将打印完整的引用名称(包括前缀)。如果指定了 full,那么如果输出到达终端,则ref名称显示为short,否则不显示ref名称。默认选项为auto

看起来你已经在你的git配置中设置了short

要强制引用名称(包括标记),只需指定:

--decorate=auto