我遇到了一个奇怪的问题。我正在尝试解析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
答案 0 :(得分:3)
检查--decorate
的{{1}}选项:
git log
打印出所有提交的引用名称。如果指定了
--no-decorate, --decorate[=short|full|auto|no]
,则不会打印引用名称前缀short
,refs/heads/
和refs/tags/
。如果指定了refs/remotes/
,则将打印完整的引用名称(包括前缀)。如果指定了full
,那么如果输出到达终端,则ref名称显示为short,否则不显示ref名称。默认选项为auto
。
看起来你已经在你的git配置中设置了short
。
要强制引用名称(包括标记),只需指定:
--decorate=auto