【问题标题】:Adding files in non-master branches (only) but not in master branch在非主分支中添加文件(仅)但不在主分支中
【发布时间】:2020-04-12 03:38:41
【问题描述】:

我使用 gitlab 进行项目托管,使用 ci 进行项目。 我有一个用例,开发人员必须在他/她的分支中添加一个文件。但是在将该分支合并到 master 时,不应将一个特定文件添加到 master 分支。

我尝试了以下解决方案:

  • 我将文件名(testfile)添加到 master 的 gitignore 并推送更改。
  • 然后,我检查了一个分支“dev”并使用以下命令添加了文件“testfile”:

    git add -f 测试文件

  • 文件已添加,我提交并推送了更改。
  • 但是,当我将“dev”分支合并到 master 时,testfile 也被合并(添加)到了 master 分支中。

    附:从技术上讲,不应该是这种情况,因为我只在 dev 分支上强制添加了文件,而在合并时我什至没有收到警告消息。

【问题讨论】:

    标签: git gitlab


    【解决方案1】:

    我建议阅读.gitignore 的作用。它对合并没有影响,也不打算这样做。你的评论

    附:从技术上讲,不应该是这种情况,因为我只在 dev 分支上强制添加了文件,而在合并时我什至没有收到警告消息。

    暗示了一些关于强制添加(和一般分期)如何工作的混淆。一旦文件被暂存(强制或其他方式)并提交,就不必再次暂存以进行合并。 (在技术层面上,阶段条目 在合并期间创建,但此过程不以排除规则为条件,因为内容已提交。如果有帮助,我想您可以考虑在合并期间看到的每个文件合并被强制添加到合并的暂存区域。)

    更一般地,分支应该有相同内容的不同版本(反映不同的变化行)[1]。某些文件永久“在”某个分支而不是另一个分支的想法与 git 的工作方式不一致。

    正如 EncryptedWatermelon 建议的那样,您可以创建一些手动过程来产生所需的结果,但我预计这些手动步骤往往会被遗忘。如果你真的想让开发者讨厌你,你可以创建服务器端的钩子来拒绝任何对包含该文件的 master 的提交;然后当他们忘记手动操作时,稍后当他们尝试推送主服务器时,服务器将拒绝推送,他们将不得不返回并修复它。

    或者,您可以重新考虑您的用例,并在使用 git 时提出符合实际需求的合理行为,就像 git 的工作方式一样。由于您尚未解释用例,因此我无法提供有关其外观的更多详细信息。


    [1] 单个 repo 中可能有不相关的分支(甚至是分支组),其内容不需要匹配;但这是一个完全不同的用例,相当于让一个存储库包含通常是多个存储库的内容。但是如果要合并两个分支,那么期望它们是相同内容的版本

    【讨论】:

    • 我的用例是:每个开发分支都会运行一套测试用例,每个开发分支的测试用例会有所不同。所以 gitlab 管道将为每个开发分支运行测试用例的结果将被检查。在通过所有测试用例然后流水线后,dev分支将与包含测试用例的文件合并到master。
    • @Ashwani - 我会失职不首先说,因为我理解你想要做什么,我不推荐它。自动化测试需要付出努力,只有当你要保存和积累测试时,这种努力才真正值得。但是如果你必须...我仍然不会将它们存储为分支提交的一部分。构建工具可能会提供一种更明智的方式来存储这种类型的东西。 (或者有一些方法可以将它存储在 git 中,但不能存储在分支提交中......但这是假设一些自定义工具设置。)
    【解决方案2】:

    使用--no-commit 标志进行合并,然后恢复文件

    git merge --no-commit dev
    git checkout HEAD <FILE>
    git add -A
    git commit
    

    【讨论】:

    • 我需要使用 gitlab-ui 合并“合并请求”。
    猜你喜欢
    • 2012-01-25
    • 2014-12-22
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    相关资源
    最近更新 更多