【问题标题】:Making Git retain different section content between branches让Git在分支之间保留不同的section内容
【发布时间】:2013-11-19 18:05:27
【问题描述】:

我正在开发一个用户脚本,我的雇主要求我开始通过 Git 进行管理。

现在,我有一个稳定文件和一个 beta 文件,这样组织中的每个人都可以安装稳定代码,但如果他们愿意,也可以选择帮助测试 beta 的添加。该文件的某些部分应保持不同,内容和更改不应在分支之间合并。

例如,如果我将 Beta 文件转换为 Git 分支,然后确定 Beta 更改是稳定的,并将 Beta 合并回稳定代码(不会更改),我理解的 Git 合并过程将根据 Beta 分支中这些行上的任何值“有帮助地”更新 Stable Greasemonkey 定义标头。这是完全不可取的,因为这些标头包含一个自动更新 URL,Greasemonkey 将检查更新。

// ==UserScript== (stable)
// @downloadURL  --  StableURL File Location
// ==/UserScript==

// ==UserScript== (beta)
// @downloadURL  --  BetaURL File Location
// ==/UserScript==

>Git Merge<

// ==UserScript== (stable)
// @downloadURL  --  BetaURL File Location
// ==/UserScript==

我想保留在 Beta 代码和 Stable 代码之间具有不同 URL 的能力,但无法确定一种方法使 Git 的合并过程忽略 Greasemonkey 需要正确执行其操作的行,但是如果我没有将 Beta 作为单独的分支,我不确定如何使用 Git 轻松地将更改的代码从 Beta 迁移到 Stable,这就是要求我采用 Git 功能的既定原因。 (嗯,另一个原因是让其他人更容易为项目做出贡献并确定项目的历史......)

非常感谢任何帮助。

【问题讨论】:

    标签: git merge


    【解决方案1】:

    您的所有更改都应该合并,除了对这些值的更改,这使得它们与其他值不同,不是对内在内容的更改,而是特定于部署的更改。这些可能最好应用于结帐后挂钩。这是一个示例,每个分支都包含处理器

    cat <<\EOF >.git/hooks/post-checkout
    #!/bin/sh
    if branch=`git symbolic-ref HEAD --short -q`; then
        for file in `git ls-files -cix*.@branch`; do
            echo "* making ${file%.@branch} from $file with branch-specific includes"
            echo '/^@include-branch-specific ([a-z/]*)$/ { s//cat \1.'$branch'/e }' \
            | sed -rf- $file >${file%.@branch}
        done
    fi
    EOF
    chmod +x .git/hooks/post-checkout
    
    # testing
    git checkout beta
    
    cat  <<\EOF >config.@branch
    // ==UserScript==
    @include-branch-specific config
    // ==/UserScript==
    EOF
    
    echo >config.stable '// @downloadURL  --  StableURL File Location'
    echo >config.beta   '// @downloadURL  --  BetaURL File Location'
    
    git add config.*
    # git rm --cached config
    git commit -m'setting up per-branch configs'
    git checkout
    
    git checkout stable
    git cherry-pick beta
    git checkout
    

    【讨论】:

    • 是的,一旦你进入它,git 就会摇摆不定。这里最好的部分是分支名称是 repo-local,您可以从任何结帐测试任何部署的新配置,而不会干扰或干扰,例如git checkout -B stable,做你的测试,然后git checkout -t upstream/stable -B stable 把它放回去。
    • @Steve(或git checkout test 使用原始分支名称进行当前结帐,然后git branch -f stable upstream/stable 将稳定引用放回)
    • 一旦我获得了结帐后的配置文件,我认为我还可以编写另一个挂钩来插入/替换基于实际代码文件顶部的适当标题行这生成的配置文件?可能在预提交中?
    • @Steve 不,“config”是一个随机数名称,测试展示了如何将钩子与您的示例数据一起使用,假设它位于一个名为“config”的文件中。将相同的方法应用于您的真实文件。
    • 我只是误解了建议对我的环境进行更改的性质。这非常有效!
    【解决方案2】:

    在您的存储库中,创建三个文件,名为 header.masterheader.branchmain.js。然后你可以在不同的分支中保留不同版本的main.js,但保持头文件相同——每个分支一个,所有的头文件都会在所有的分支中。

    制作一个名为build.sh的构建脚本,如下所示:

    #! /bin/sh
    cat header.$(git rev-parse --abbrev-ref HEAD) main.js >myscript.js
    

    用户必须运行您的构建脚本,或者您必须自己提供预构建的用户脚本 - 但我猜您已经在执行后者,因为您有一个下载 URL!

    【讨论】:

    • 谢谢,这是有道理的,看起来应该可以工作,但是(正如我所料)是一种将问题移到 Git 之外的解决方案......
    【解决方案3】:

    您可以为 git 编写自定义合并驱动程序,并配置 git 以使用它 - 但这可能比它的价值更麻烦。

    【讨论】:

      【解决方案4】:

      从所有文件中删除@downloadURL 行。

      the @downloadURL documentation 开始,当省略该行时,Greasemonkey 将检查最初加载脚本的 URL 以获取更新。发布用户将从发布位置更新,测试用户将从测试位置更新。

      如果用户想要从一个分支切换到另一个分支,他只需先删除脚本,然后从相应的分支加载。

      同样,脚本也不应该有@updateURL 行。

      【讨论】:

      • 这可能是 GM 文档所说的,但在我的项目实施中没有观察到这一点,可能是因为文件内部托管在 Greasemonkey 不识别为“安全”的服务器上。遗憾的是,该项目无法控制为其选择的托管位置,并且必须使用所提供的内容...... @downloadURL 行是提供任何自动更新支持的唯一已知方法。 (此外,如果一个脚本都安装但只有一个正在运行,则脚本名称不同,以便更容易区分它们。原始问题的辅助:解决一个,解决两个。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 2020-06-18
      相关资源
      最近更新 更多