GIT 能否只在一个分支中跟踪文件而在其他分支中不跟踪文件?

Can GIT track a file only in one branch but not on other?

我使用 GitFlow 作为 git 工作流程。我为电子微控制器编程。

当我在开发分支上时,我不需要跟踪或提交已编译的 HEX 文件,我只需要代码。但是当我在发布或主分支上时,我确实需要提交生成的 HEX 文件。

目前我 "mentally" 忽略 HEX 文件,只在我需要的时候暂存和提交它。但是有点麻烦,把它放在那里,总是看着你,问 "why all the other files, but not me"...
我有点内疚,我不想看到它在那里,除非我在适当的时候分支.

有什么建议吗?

没有什么好方法可以做您想做的事。我还建议您重新检查一些假设,因为当您说“...当我在 [某个分支] 上时,我确实需要 generated [anything]...”(强调),这告诉我你可能不会让你的源代码控制系统只是一个源代码控制系统。

只是说 "keep a different .gitignore on each branch" 的问题是,(1) 它没有考虑到您会定期创建需要 而不是 忽略的分支这一事实HEX 文件,来自需要忽略 HEX 文件的分支; (2) .gitignore 的其中一个版本将被视为对另一个版本的修改,因此例行合并有可能悄悄地将更改转移到不应该得到它的分支中。

您可以使用 gitflow 提供的结构使其更易于管理,尤其是当您编写围绕 release 分支的 branch-and-merge 活动脚本时。您可以只将 HEX 文件保留在您的 .gitignore 中,但是 force-add 在每个 release 分支上暂存第一次提交时它。这里有几个要点:

1) .gitignore 所做的只是说如果有未跟踪的文件与特定路径模式匹配,这些文件应该 默认 保持未跟踪。一旦文件 跟踪,.gitignore 就没有进一步的影响。

2) 如点 (!) 中所用,"tracked" 仅表示 "in the index"。如果文件在提交 A 但不在提交 B 中,则在提交 AB 之间移动通常会更新索引,以便文件被跟踪或取消跟踪相应地,每次结帐。 但这确实会产生一个问题...

2a) 如果您在 develop,其中 HEX 文件是 .gitignored,但您的工作树中有一个未跟踪的 HEX 文件;然后你 git checkout master (其中 master 确实 有一个 HEX 文件),git 将忽略你未跟踪的 HEX 文件并允许结帐,导致你要覆盖的本地版本。您将无法恢复 HEX 文件。同样,由于您说文件已生成,所以这可能没什么大不了的;但要记住这一点。

3) 您可以通过使用 git add-f 选项来覆盖保持忽略文件未被跟踪的默认行为,如

git add -f path/to/HEX/file

如果您遵循 git 流程合并模式,那么您可以在每次创建 release 分支时简单地执行此操作 force-add,覆盖 [=13] 上的忽略规则=] 分支(以及 master,它由来自 release 分支的合并组成)。到目前为止一切顺利。

当然,那些发布的合并确实存在问题,因为每次他们都会看到新的 HEX 文件与旧的冲突(因为据 git 可以看出它们是独立创建的。从本质上讲,您想要的是默认合并策略的 "theirs" 选项的行为(如果存在冲突,请从我正在合并的分支中获取版本)。您可能不想使用该选项 except 对于那个文件;你可以使用 .gitattributes 来组装一些东西。

如果你做 hotfix 分支也会有问题,因为它们是从 master 分支出来的(所以它们会有 HEX 文件)但是你将它们合并到两个 masterdevelop。所以每个修补程序都有将 HEX 文件 "leaking" 放入 develop 分支的风险(之后你必须再次删除它才能使忽略规则起作用)。

如果这看起来很麻烦,那确实是。同样,在我看来,这是因为您正在违背源代码控制工具的原则。需要澄清的是,这些问题并不是我提出的解决方案所特有的,而是会随着 any 所述问题的解决方案而出现。如果 git 发现文件在每个发布分支上突然出现,但在开发或功能分支上不存在,则合并到主 冲突和修补程序 冒着复制文件进行开发的风险,无论您是如何到达那里的。