前言:
提交时,我倾向于将消息格式化如下:
[<task number>] <task title>
应该通过 pre-push 挂钩将其转换为有效的 GitHub 语法,如下所示:
Work item [[<git_branch>](http://tracker/_workitems/<git_branch>)]:
- [x] [[<task_number>](http://tracker/_workitems/<task_number>)] <task title>
然后将其cat
转换为控制台输出,因此我可以将其复制粘贴到 github 上的 PR 描述中。
任务
更进一步,将该消息放入剪贴板,这样我就不必手动选择它并从控制台复制。因为我在 Linux 机器上,所以我决定使用xclip
这个任务。
我当前的 git hook 脚本如下所示:
#!/bin/sh
PBI=\`git symbolic-ref --short HEAD\`
echo "**Backlog Item [$PBI]:**\n" > pr_messages/$PBI.md
git log develop..HEAD --format=" - [x] %B" >> pr_messages/$PBI.md
sed -r -i 's|\[([0-9]{4,})\]|[[\1](http://tracker/_workitems/\1)]|g' pr_messages/$PBI.md
cat pr_messages/$PBI.md
问题
当我将以下行添加到此脚本的末尾时
cat pr_messages/$PBI.md | xclip -selection clipboard
我在 Ctrl+C/V 剪贴板中收到消息,但 git 挂起,我必须中止它。鉴于它应该是一个 pre-push 钩子,它有效地阻止了我实际推送我的代码。
UPD:正如@wumpus-q-wumbley 所建议的,这是 strace 输出:
$> ps aux | grep git
kraplax 29796 0.0 0.0 25696 5660 pts/1 S+ 12:55 0:00 git push
kraplax 29797 0.0 0.0 48276 3040 pts/1 S+ 12:55 0:00 ssh git@github.com git-receive-pack 'eduard-sukharev/ProFIT.git'
$> sudo strace -p 29796
Process 29796 attached
wait4(29797,
^CProcess 29796 detached
<detached ...>
$> sudo strace -p 29797
Process 29797 attached
select(7, [3 4], [], NULL, NULL
^CProcess 29797 detached
<detached ...>
这基本上表明 git-push 正在等待ssh git@github.com git-receive-pack 'eduard-sukharev/ProFIT.git'
挂起的 ssh 进程。这一切都稍微转移了问题的焦点。
UPD2:设置GIT_TRACE=~/git_trace.log
提供此信息:
$ cat ../git_trace.log
trace: built-in: git 'rev-parse' '--abbrev-ref' 'HEAD'
trace: built-in: git 'rev-parse' '--abbrev-ref' 'HEAD'
trace: built-in: git 'status' '--porcelain'
trace: built-in: git 'push'
trace: run_command: 'ssh' 'git@github.com' 'git-receive-pack '\''eduard-sukharev/ProFIT.git'\'''
trace: run_command: '.git/hooks/pre-push' 'origin' 'git@github.com:eduard-sukharev/ProFIT.git'
trace: built-in: git 'symbolic-ref' '--short' 'HEAD'
trace: built-in: git 'log' 'develop..HEAD' '--format= - [x] %B'
trace: built-in: git 'rev-parse' '--abbrev-ref' 'HEAD'
trace: built-in: git 'status' '--porcelain'
问题
如果没有,为什么这个过程会挂起?
我应该如何重写那行来完成预期的任务?
我应该使用其他工具来管理剪贴板xclip
吗?