我有几个非裸的Git存储库。有一个中央Git存储库(或者至少作为中央回购处理,这可能会改变),但这也是非空的(因为我希望在同一台机器上签出)。我的历史大多是线性的,我是唯一会对这个存储库进行更改的人,所以冲突不太可能发生。(这是我的文档目录。)
如果我到处使用master分支,直接推入另一个非裸存储库是行不通的。有receive.denyCurrentBranch会允许这样做,但是它并没有真正帮助我,因为(1)它没有更新本地签出,(2)我担心在发生冲突时会发生什么。
这里有几个相关的/类似的问题:
ssh git pull).post-update钩子(有一个强烈的建议来避免)。或者将其推送到特定的唯一远程引用,并让目的地稍后处理合并.。
我想要一个百分之百安全的解决方案。所以我认为使用post-update钩子对我来说是没有选择的。
我认为我的用例并不是那么罕见,所以我想知道是否有一些通用的解决方案。在那里吗?
我想我想要的是:
master推送到一些远程特殊参考文件(如merge-request-xy) (如git push origin master:merge-request?)。在远程上的git merge merge-request && git branch -D merge-request?)。f 222
这样做是安全的还是好的?
发布于 2011-08-25 17:39:50
您建议的解决方案是安全的,只要您(1)推到与master不同的分支,如merge-request和(2)对合并进行检查。对于第二部分,快速转发,如果遥控器上的所有内容都已清空,您可以使用像下面这样的post-update钩子:
#!/bin/sh
# check args to see if merge-request was pushed,
# and do nothing if it wasn't
if ! $(echo $@ | grep -q 'merge-request');
then
echo "merge-request not updated"
exit 0
fi
# cancel if master is not checked out
THIS_BRANCH=$(git branch --no-color | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$THIS_BRANCH" != "master" ];
then
echo "master not checked out, not merging"
exit 1
fi
# cancel if working dir is dirty
if [ $(git status --porcelain | wc -l) != 0 ];
then
echo "working dir is dirty, not merging"
exit 1
fi
# try to merge, but only do so if the merge is fast-forward
# try to delete, but only do so if the merge succeeded
git merge --ff-only merge-request && git branch -d merge-request确保chmod +x后更新脚本。推送时,这个钩子的输出将显示在以"remote:“开头的控制台中。
为了从master推入远程origin/merge-request,可以在远程配置中在.git/config中设置push变量(允许调用git push origin )。
[remote "origin"]
push = +refs/heads/*:refs/merge-request/*或者您可以设置一个特定于回购的别名:
[alias]
push = push origin master:merge-request发布于 2011-08-25 17:30:52
使用post-update挂钩推进到非裸存储库的危险部分是,如果远程工作副本不干净和/或您不能进行快速转发。如果要在解决方案中添加这些预条件,最好使用测试更好的带有签出选项的post-update挂钩。
如果你不能保证这些先决条件,你将不得不解决来自另一端的任何冲突。在这种情况下,您最好还是使用post-update钩子选项,但是确保在没有--force的情况下进行签出,这样如果发生冲突,就不会丢失本地更改。
我还是不明白为什么这么多人似乎不愿意在同一台机器上进行光秃秃的和非裸露的回购。我家里有一个裸露的回购工具,我把它从家里和工作中推到。当我开始在任何一个地方工作时,我都会进入我的非裸存储库。它需要2秒,我总是在最好的物理位置来解决任何潜在的冲突。
https://stackoverflow.com/questions/7192552
复制相似问题