我刚刚在还拥有 Git 存储库的服务器上安装了 Trac 1.0.1。我希望能够通过在 Git 提交消息中包含诸如“修复 #3”之类的内容来关闭 Trac 票证。这应该很容易——通过在我的存储库中包含一个post-receive钩子,我可以在每次git push到服务器之后执行一些代码(例如 Python 脚本)。但是要使用哪一段代码呢?
在跑来跑去一段时间并经历了几个死胡同之后(包括在这个主题上含糊不清的 Trac Git 页面,以及在错误 #7301被修复之前实际上不会工作的Git 插件(?!)),我找到了解决方案。
通过“设置 Trac 环境”中的步骤将您的 Git 存储库连接到 Trac 。
启用提交单更新插件,或者通过Trac系统的“管理”部分或编辑trac.ini。
post-receive在hooks您的 Git 存储库目录中创建一个名为的文件,内容如下:
#!/usr/bin/ruby
ARGF.lines do |line|
fields = line.split
oldrev = fields[0]
newrev = fields[1]
refname = fields[2].chomp
if oldrev =~ /^0+$/
revspec = newrev
else
revspec = oldrev + '..' + newrev
end
other_branches = `git for-each-ref --format='%(refname)' refs/heads/ | grep -F -v "#{refname}"`
other_branches = other_branches.chomp.gsub /[\r\n]+/, ' '
commits = `git rev-parse --not #{other_branches} | git rev-list --stdin #{revspec}`
commits.each_line do |commit|
system "trac-admin .../trac changeset added '(default)' #{commit.chomp}"
end
end
Run Code Online (Sandbox Code Playgroud)
当然,将“.../trac”替换为您的 Trac 安装的绝对路径。
我实际上是通过Virtualenv使用 Trac 。如果您也是,请将其添加到文件顶部:
require 'tempfile'
def virtualenv_system(cmd)
script = Tempfile.new('post_receive')
script.write 'source .../virtualenvs/trac/bin/activate'
script.write "\n"
script.write cmd
script.close
system "bash #{script.path}"
script.unlink
end
Run Code Online (Sandbox Code Playgroud)
并将system呼叫替换为virtualenv_system。
使这个post-receive文件可执行。
这是受到Repository Administration 页面上给出的方法的启发,结合这个关于在 post-receive 脚本中获取所有新提交的SO 答案。我相信这个脚本虽然很长,但在您推送多个提交和/或将提交推送到当前签出的分支以外的分支时,它的行为是正确的。(在 Repository Administration 页面上给出的脚本在这些情况下无法正确运行——它只查看来自 HEAD 的最新提交消息。)
在此设置过程之后,任何包含“fixes #7”等字符串的 Git 提交都将关闭 Trac 中的相应票证。您可以使用Commit Ticket Updater 页面上列出的选项对此进行一些配置。具体来说,您可能想要更改commit_ticket_update_envelope;的值。它并不完全清楚,但我认为默认设置为您必须将命令包含在方括号中,例如“Refactored MyAwesomeClass [fixes #42]”。
| 归档时间: |
|
| 查看次数: |
1288 次 |
| 最近记录: |