我在 git 中创建了一个 post-receive 挂钩。钩子将消息输出到屏幕,这些消息被发送回执行推送的 git 客户端,然后输出回来。
如何去掉每行输出之前的“remote:”文本?这是相当分散注意力的。(我知道这是可能的,因为我在实践中见过它,我只是不知道它是如何完成的。)
我正在使用带有trac的git.推后我想做两件事:
第一件事是通过git-commit-notifier解决的.在我创建post-receive hook之后它完美地工作:
#!/bin/sh /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
我的第二个要求可以在http://trac-hacks.org/wiki/GitPlugin#post-receivehookscripts中解释.它也适用于这种后接收挂钩:
#!/bin/sh /var/trac/testgit/commit-updater
当它们分开时,这两件事都有效.但我需要将它们结合起来.所以我创建了post-receive钩子:
#!/bin/sh /var/trac/testgit/commit-updater /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
这很有趣,但这不起作用.单独运行时,命令运行得非常好,但只有第一个在放入后接收挂钩时才能运行.
如果我有这样的钩子:
#!/bin/sh /var/trac/testgit/commit-updater /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
我收到以下错误
/var/lib/gems/1.8/gems/git-commit-notifier-0.8.0/bin/git-commit-notifier:12: undefined method `strip' for nil:NilClass (NoMethodError)
from /var/lib/gems/1.8/bin/git-commit-notifier:19:in `load'
from /var/lib/gems/1.8/bin/git-commit-notifier:19
但是,如果我改变这两个命令的顺序,我没有收到任何错误,但只有第一个命令工作.
我将不胜感激任何帮助.我试图解决这个问题很长一段时间,我没有想法.
我需要在服务器端挂钩中获取已更改文件的列表。例子:
Local commit 1:
M test.txt
M test2.txt
Local commit 2:
M test.txt
A test3.txt
Run Code Online (Sandbox Code Playgroud)
两个提交都被推送到服务器(裸仓库)。我需要遍历文件列表并通过 curl 在其他地方发布每个文件:
M test.txt
M test2.txt
A test3.txt
Run Code Online (Sandbox Code Playgroud)
我正在努力寻找实现这一目标的文档。我知道这些修订是针对标准输入的。我如何实际遍历推送的文件,并引用它们进行 curl 上传(这似乎很困难,因为它是一个裸仓库)?
#!/bin/bash
while read oldrev newrev refname; do
echo $oldrev
echo $newrev
echo $refname
done < "${1:-/dev/stdin}"
Run Code Online (Sandbox Code Playgroud) 我正在使用Git来管理我的网站的源代码和部署,目前在同一个盒子上运行测试和实时网站.最初在这个资源http://toroid.org/ams/git-website-howto之后,我想出了以下post-receive钩子脚本来区分推送到我的实时站点并推送到我的测试站点:
while read ref
do
#echo "Ref updated:"
#echo $ref -- would print something like example at top of file
result=`echo $ref | gawk -F' ' '{ print $3 }'`
if [ $result != "" ]; then
echo "Branch found: "
echo $result
case $result in
refs/heads/master )
git --work-tree=c:/temp/BLAH checkout -f master
echo "Updated master"
;;
refs/heads/testbranch )
git --work-tree=c:/temp/BLAH2 checkout -f testbranch
echo "Updated testbranch"
;;
* )
echo "No update known for $result"
;;
esac …Run Code Online (Sandbox Code Playgroud) 在某些条件下,我希望我的 post-receive hook 负责更新 repo 本身中的版本文件。因此,假设我的存储库中有一个文件 version.txt,我希望 post 接收挂钩更新 version.txt 中的版本字符串。
这将意味着再次推动回购。这可能吗?
谢谢!
我想弄清楚如何做以下(并弄清楚它是否可能).
我有一个面向各种东西的文件夹的本地git仓库,但我希望能够到我的网站使用Git部署到我的开发服务器,真的只有一个文件夹中的内容应该进入远程Web根目录(只是内容文件夹,而不是文件夹本身,这是艰难的一点).我有一个git push到dev服务器进入web可访问文件夹之外的一个裸仓库,然后我使用post-receive脚本将所有工作文件放入webroot.但是,这会复制所有文件夹,显然我只希望在操作完成后移动一个特定文件夹的内容.
做一些研究,看起来稀疏结账将是一个很好的选择.更新:我现在有工作,它只会复制一个特定的文件夹,但我仍然没有得到它忽略文件夹本身,只是拉内容.我认为这与我添加到.git/info/sparse-checkout的路径/通配符有关,但我不确定排除目录但不排除其内容的模式.
有没有办法做到这一点?我应该只使用post-receive脚本手动复制我想要的目录的内容,而不是尝试使用稀疏结账直接进行吗?
我很感激任何人愿意给予的帮助.谢谢!
我试图在服务器端执行一个post-receive挂钩,它将为push中的每个提交运行一次Python脚本.
我有一个循环:
while read oldrev newrev refname
do
python /local/Git/util.py $newrev $oldrev $refname
done
Run Code Online (Sandbox Code Playgroud)
但是这只运行脚本,仅用于push中给出的最后一次提交.
有没有办法为一次推送推送到服务器的所有提交运行脚本?
我在CentOs 6服务器上使用git 1.7.1,当我git --bare init在my_repo.git上运行时,我检查了my_repo.git/hooks,我可以看到所有挂钩,包括post-receive.sample.
现在我在Centos 7服务器上使用git 2.4.1,并且post-receive.sample文件是missng,所有其他挂钩都在那里,但不是我需要的.
我知道我可以从之前的repo复制文件,然后根据需要更改内容,但我想知道为什么post-receive.sample不像以前那样生成.
我有一个以用户'git'运行的post-receive钩子.我有一个可以被git读取的virtualenv/python/ve // bin/activate.运行:
source /python/ve/<name>/bin/activate
Run Code Online (Sandbox Code Playgroud)
适用于git组中的用户.
当它在推送后作为post-receive挂钩运行时,我收到错误"source:not found".
我不确定在哪里可以看到 - 任何提示都非常赞赏.
我正在使用Python和Git-Python编写一个git post-receive钩子,该钩子收集有关推送中包含的提交的信息,然后用摘要更新我们的错误跟踪器和IM。在推送创建分支的情况下,我遇到了麻烦(即fromrev,后接收的参数全为零),并且在该分支上还跨越了几次提交。我正在从torev提交中倒退父母列表,但是我不知道如何确定哪个提交是分支中的第一个提交,即何时停止查找。
在命令行上我可以做
git rev-list this-branch ^not-that-branch ^master
Run Code Online (Sandbox Code Playgroud)
这将给我确切的提交清单this-branch,而没有其他人。我尝试使用记录的Commit.iter_parents方法复制此方法,该方法记录为采用与git-rev-list相同的参数,但据我所知,它不喜欢位置参数,而且我找不到一组关键字参数那个工作。
我读了Dulwich的doco,但尚不清楚它是否会做与Git-Python截然不同的事情。
我的(简化)代码如下所示。推送开始新分支时,当前仅查看第一次提交,然后停止:
import git
repo = git.Repo('.')
for line in input:
(fromrev, torev, refname) = line.rstrip().split(' ')
commit = repo.commit(torev)
maxdepth = 25 # just so we don't go too far back in the tree
if fromrev == ('0' * 40):
maxdepth = 1
depth = 0
while depth < maxdepth:
if commit.hexsha == fromrev:
# Reached the start of the push
break …Run Code Online (Sandbox Code Playgroud)