git - 如何推送和自动更新我的非裸远程 git 存储库的工作副本?

标签 git

另请参阅此相关问题,它有最新的答案:https://stackoverflow.com/a/28262104/7918 .

如何推送和自动更新我的非裸远程 git 存储库的工作副本?

在 git 人们会说“这是不安全的”之前,请让我解释一下为什么在我的情况下这会起作用。我有存储库 foo在机器上AB . A恰好是我的本地机器,B位于 super 计算网格上。项目正常开发于A (经过一些测试)然后推送到 B进行更多测试并将作业提交到网格。两个存储库都有工作目录。 A 上的存储库和 B是私有(private)的并与我的用户帐户相关联。

现在 git flow 是这样的:

  • 提交 A
  • A
  • 获取 B
  • merge B

  • 我宁愿省略步骤 3 和 4。即:我想在推送时更新远程非裸存储库 , 如果从 A 更改可以自动安全地 merge (即:当 merge 是快进时,B 上的工作目录是干净的)。

    第一个解决方案是在 B 上删除存储库只需使用 rsync同步代码,但这是不可取的,因为有时我会直接在 B 上进行一些更改,并且不希望这些更改被轻易覆盖。

    第二个建议是安装 this patch ,甚至被 merge 到 mysysgit (但不是正确的)。这个补丁增加了updateInstead receive.denyCurrentBranch 的值git 选项。这是可行的,但我宁愿不在许多机器上修补 git。

    第三种解决方案( taken from here )将涉及拥有三个 git 存储库:A , B' , B .在哪里 B'裸露并使用 Hook 同步AB .这真的很简单,但我想拥有三个存储库可能会增加整个系统的脆弱性。

    最后一个解决方案是首选:即使用存储库上的 Hook B自动将推送的更改 merge 到工作副本。每个人都说这样做很简单,但我想我对 git 内部知识的了解太薄弱,无法修补一些明智的东西。我对此做了一些工作,但没有任何实际工作。

    我在找什么:
  • 基于钩子(Hook)的解决方案,将在推送时自动 merge 远程非裸仓库。这不会:要求我重新编译 git,并创建额外的存储库。
  • 最佳答案

    我印象深刻,但也被上面答案中的思想深度吓倒了。假设我已经完成了本地提交,我最终只写了一个蹩脚的小 bash oneliner 来完成我想要的大部分工作:git push origin master; ssh -t ec2-user@XXX.com 'cd /var/www/XXX.com/httpdocs; bash --login'这让我进入了运行 git pull 的工作目录;我本可以将它添加到脚本中,但不知道如何让它在我的登录目录中查找我的 SSH key 。所以我仍然必须输入“git pull”然后“退出”,但它比以前更好了!

    关于git - 如何推送和自动更新我的非裸远程 git 存储库的工作副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25207942/

    相关文章:

    git - 我可以配置 git 使其不猜测 user.email 配置设置吗?

    git - Perforce p4 相当于 git 中的交换

    git - 使用 git flow 发布时,我应该如何更新 pom.xml 中的版本?

    git - 如何进行递归 'git checkout'?

    git - 在 Git Repo 中增量保存 Clojure 数据结构

    Git:使用 key 文件但不使用 ~/.ssh/config 通过 ssh 访问远程存储库

    git 树包含重复的文件条目

    ruby-on-rails - 如何将 Git 子目录推送到 heroku?

    Git 推送错误 - 无法解析主机名

    git - 如何始终在 Git 中显示完整的历史记录?