【问题标题】:Git: merging public and private branches while while keeping certain files intact in both branchesGit:合并公共和私有分支,同时在两个分支中保持某些文件完整
【发布时间】:2009-11-27 06:07:21
【问题描述】:

我在这里阅读了一些 git 问题,但找不到这个问题的答案:

我有一个公共分支和一个私有分支,我希望允许某些文件分流。

这些是带有密码和我的本地自定义的配置文件。

我确实希望能够以两种方式合并分支:从私有到公共再返回,但我不想让这些特定文件自动合并。

有没有办法以这种方式设置 git?我很想找到一个自动化的解决方案 :) - 这样就可以像往常一样进行合并。


编辑:这是对我有用的解决方案(感谢 VonC 对 gitattribute 的建议)

对我来说唯一出乎意料的是“合并保护”仅在两个分支中的文件发生分歧后才开始工作,而不是在应用以下配置后立即开始

.gitattributes(如果你想分享这个,用 git 跟踪)或 .git/info/attributes:

file1      merge=keepmine
path/file2     merge=keepmine

keepmine 是命名的自定义合并管理器,它只是一个调用的无操作命令,而不是在下面设置的选定文件上的内部合并驱动程序

当从私有分支合并到公共分支时,我通常使用git merge --squash private。这样私人编辑就不会进入公共分支的 git 历史记录。

.git/config:

#public repository
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = <public repo git url> 

#private repository
#has to set up with git init and populated with the initial commit to branch mybranch
[remote "private"]
    push = +:
    url = /path/to/local/private/repo 
[merge "keepmine"]
    name = dont_merge_selected_files
    driver = echo %O %A %B 
[branch "master"]
    remote = origin
    merge = refs/heads/master 

#private branch settings
[branch "mybranch"]
    remote = private
    merge = refs/heads/mybranch

如果有改进的方法请评论

【问题讨论】:

    标签: git merge dvcs


    【解决方案1】:

    为了安全起见,您可以为这些私人文件添加git attribute(请参阅here for an example)。

    这样,您可以定义一个脚本(“合并管理器”),该脚本将确保包含私人信息的文件在公共分支上合并时保持为空(或具有公共内容),同时在合并后保留其本地内容到私人分支机构。
    这意味着您可以在不考虑该文件的情况下合并/变基。

    【讨论】:

    • 这仅在两个分支中的文件都更改时才有效。一旦使用keepmine解决了合并,另一个分支中的以下合并将通过递归解决。
    【解决方案2】:

    一种方法是使用git rebase。通过在master 的末尾保留您的私人更改作为一些提交,您可以将公共内容提交到master 分支(或任何您选择的工作分支),然后在任何时候将您的私人分支重新定位到主分支你想更新。

    另一种处理方法是将模板配置文件保存在 Git 中,例如 frobozz.config.template。在您的工作目录中,将frobozz.config.template 复制到(未版本化的)frobozz.config 并进行修改。如果您需要备份本地更改,请务必备份您的工作目录。

    【讨论】:

      【解决方案3】:

      这似乎只在检测到合并冲突时才有效。在分支之间来回合并文件确实会被覆盖。除非我设置错误。当然这在 windows msysgit git 版本 1.6.5.1.1367 上。

      【讨论】:

      • @yoyodyn 是的,你说得对,这只适用于有合并冲突的文件。
      • 您不妨考虑只将一种方式从公共合并到私有,但在这种情况下,您必须保持自律 - 仅在公共分支/存储库上开发公共功能
      • 我实际上得到的是在不同地理位置的同一个 repo 的三个克隆。我们的办公室在 master 分支,另一个站点在 test 分支,因此客户可以做 QA,第三个是当前运行代码所在的生产分支。我们至少有一个文件 Macros.h,我们包含在许多 c++ 项目中,根据它的主、测试或生产,它为宏保存不同的值。我一直在试图找到一种方法来防止 macros.h 文件在分支之间合并。
      【解决方案4】:

      将密码置于版本控制之下是最糟糕的主意。您需要 CVS 而不是 git 来处理单独的文件。 Git 与许多其他现代 DVCS 一样使用整个树,而不是使用单独的文件。

      【讨论】:

        猜你喜欢
        • 2019-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-18
        • 1970-01-01
        • 2013-05-02
        相关资源
        最近更新 更多