使Git在分支之间保留不同的部分内容

时间:2013-11-19 18:05:27

标签: git merge

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

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

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

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

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

>Git Merge<

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

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

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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

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