git - 保持多个(非裸)Git repos 同步的最佳/最简单方法

标签 git synchronization

我有几个非裸 Git 存储库。有一个中央 Git 存储库(或至少作为中央存储库处理;这可能会改变)但这也不是裸露的(因为我想在同一台机器上 checkout )。我的历史基本上是线性的,而且我是唯一一个对这个存储库进行更改的人,所以不太可能发生冲突。 (这是我的文档目录。)

如果我在任何地方都使用 master 分支,直接推送到另一个非裸仓库是行不通的。有 receive.denyCurrentBranch 允许这样做,但它并没有真正帮助我,因为 (1) 它不会更新本地 checkout ,并且 (2) 我担心万一发生什么是冲突。

这里有几个相关/类似的问题:

我想要一个 100% 安全的解决方案。所以我认为使用 post-update Hook 对我来说不是一个选择。

我认为我的用例实际并没有那么罕见,所以我想知道是否有一些通用的解决方案。有吗?

我想,我想要的是:

  • 将本地 master 推送到一些远程特殊引用(如 merge-request-xy)(即像 git push origin master:merge-request ?).
  • 在远程,如果我们可以快进并且工作副本是干净的,快进,更新工作副本并删除引用(基本上 git merge merge-request && git branch -D merge-request ?).

这样做安全还是好的方法?

最佳答案

只要您 (1) 推送到与 master 不同的分支,例如 merge-request 并且 (2) 进行检查,您建议的解决方案就是安全的关于 merge 。对于第二部分,如果远程上的一切都清楚,则快进,您可以使用像这样的 post-update Hook :

#!/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 您的更新后脚本。推送时,此 Hook 的输出将显示在以“remote:”开头的控制台中

为了从 master 推送到远程的 origin/merge-request,您可以在远程设置 push var在 .git/config 中配置(它可以让你调用 git push origin:

[remote "origin"]
    push = +refs/heads/*:refs/merge-request/*

或者你可以设置一个特定于 repo 的别名:

[alias]
    push = push origin master:merge-request

关于git - 保持多个(非裸)Git repos 同步的最佳/最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7192552/

相关文章:

java - IntelliJ : Adding ALL Files to git repository

python - 为什么 Github API 允许我访问但不列出私有(private)仓库?

python - 通过 GitPython 进行 Git 推送

git - 不是有效的对象名称 : 'master'

c# - 具有变体的生产者-消费者 - 如何与线程信号/等待同步?

tomcat - 在 Tomcat 中缓存准备好的语句有什么好的策略?

git - 什么是 git 标签,如何创建标签以及如何 check out git 远程标签

Android - 离线模式 - 同步数据

java - java中的同步块(synchronized block)

mysql - SQL Server 同步到 MySQL 程序