在两个不同的分支中有同一文件的两个不同副本

3

你知道如何在git的两个不同分支中拥有同一个文件的两个不同副本吗?

假设我有一个名为config的文件。
我的目标是在dev分支和master分支中拥有这个文件的不同副本。

重要的是这个文件不能在gitignored列表中被忽略。


你的意思是配置文件没有被暂存吗? - Lynch
如果我理解正确,您不希望将文件合并回主分支,反之亦然? - rubenvb
正确。我不想要 - Mazzy
所以,你确实希望git在你切换分支时自动为你切换文件内容,但你不希望git为任何一个分支存储和管理文件内容?这似乎是一组自相矛盾的要求。 - torek
1
这是您想要的吗?链接 - xuhdev
显示剩余2条评论
1个回答

1
你可以检出2个分支。修改文件并将其提交到每个分支。
如果您想合并分支并在每个分支中拥有2个单独的文件(不同的内容),请将更改提交到分支,然后在.gitattributed中设置所需的文件始终获取ours文件-这将导致该文件永远不会被覆盖
阅读所有相关信息并设置它在这里:
https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes#Merge-Strategies 您还可以使用Git属性告诉Git在项目中的特定文件中使用不同的合并策略。
其中一个非常有用的选项是告诉Git在文件存在冲突时不要尝试合并特定文件,而是使用您的合并结果而非别人的。
如果您的项目中的某个分支已经分叉或专门化了,但您仍希望能够从中合并更改,并且希望忽略某些文件,则此选项非常有用。
config_file merge=ours

正如@torec在他的评论中提到:

要小心git中我认为是一个bug的问题:如果git可以轻松地合并文件,则不会运行您的自定义合并驱动程序。 Git在尝试3路合并之前始终首先尝试简单的2路合并。

因此,另一个选项是使用smudge/clear过滤器来确保您拥有正确的文件。

Smudge

阅读有关它的所有信息并设置它在这里:
https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes

原来在提交/检出文件时,可以编写自己的过滤器进行替换。这些过滤器称为“clean”和“smudge”过滤器。在“.gitattributes”文件中,您可以为特定路径设置过滤器,然后设置脚本以在检出文件之前(“smudge”,参见图8-2)和在暂存文件之前(“clean”,参见图8-3)处理文件。这些过滤器可以设置为执行各种有趣的操作。

enter image description here


实际上,这对我的情况不起作用。在我的情况下,配置文件始终保持不变,因此不会对其应用合并操作。这与上面提到的问题建议的是相同的,但用户报告称它不起作用。 - Mazzy
那么如何拥有不同的文件呢?你必须在每个分支上进行更改,以便它们被更改。我错过了什么吗? - CodeWizard
不同的内容 = 变化。不是吗? - CodeWizard
2
请注意 git 中我认为的一个 bug:如果 git 能够轻松地合并文件,则不会运行您的自定义合并驱动程序。Git 总是首先尝试简单的两路合并,然后再尝试三路合并。 - torek
我同意,在这种情况下我会使用模糊/清除。 - CodeWizard
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接