在Git的分支机构之间共享文件

问题描述:

我的项目中有许多文件有时会被修改,但总是在很多不同的分支中共享。例子包括构建脚本,包含路径的批处理文件等。甚至.gitignore文件本身就是一个例子。在Git的分支机构之间共享文件

我想在源代码控制这东西,但我不希望个别分支跟踪他们的变化。

你如何处理这种情况?

你在Git中跟踪与项目相关的所有内容吗?共享对象的方法是什么?

.gitignore是我唯一的选择吗?

保持您的构建脚本和批处理文件在一个单独的回购?

+3

这是接近(它们保持在远程仓库),但我认为一个子模块将会更适合。 – 2011-06-07 16:53:06

+2

@Jon子模块*是*只是一个单独的回购... – meagar 2011-06-09 16:23:09

+3

@meagar这是真的,但“单独的回购”并不意味着子模块。 – 2011-06-11 02:23:40

对于简单系统,我将创建这些文件的基本版本,这些文件在版本控制中,然后针对每个实例进行调整,其中的文件位于.gitignore中。

如果我使用更复杂的工具链,我将创建描述基础件的源XML文件,描述特定实例变体的XML文件,然后使用配置文件或命令行属性运行XSLT以生成作为构建配置/脚本的一部分,取决于您的毒性。这并不一定是XML/XSL,我只是用XML处理很多,你可以使用任何种类的与你的构建环境一起工作的临时系统,比如说带有perl脚本的文本文件,或者只是sed/awk。

通过设置跟踪文件的skip-worktree位,可以达到与.gitignore文件相同的效果。

git update-index --skip-worktree <path_to_file> 

Git现在会假装你的文件是最新的。

其他答案并没有像我想的那样清晰地解决我的问题,但他们的确促使我研究更多的选择。

首先,git没有跟踪单个文件的概念,只有整个存储库和分支。

没有内置的方法可以选择一组应该在源代码管理中维护并独立于其他单独分支管理的文件。

在我的项目中,几乎所有的共享文件都在一个特定的子目录中。尽管源代码树的其余部分可能会发生变化,并应由个别分支机构管理,但此“配置”文件集可以在各分支机构之间共享,以使存储库处于“活动”状态。

我找不到解决方案,因为我没有阅读关于git的书籍,也不知道正确的搜索词。 Git针对这种情况的解决方案是submodule

相反,如果我的配置信息散布在单个目录中未包含的单个文件中,则子模块不太适合。

在这种情况下,一个remote git repository should be set up and the files would be maintained in the separate repository using git-push

不是依靠子模块,你考虑过git-subtree

正如documentation说:

子树不与 子模块,这意味着对于 相同的任务相混淆。

与子模块,子树 不需要任何特殊结构 (如.gitmodule文件或gitlinks)是 出现在你的资料库,并做你的资料库没有 力终端用户 做什么特别或理解 子树是如何工作的。

子树只是一个 子目录,可以承诺, 分支,并在任何你想要你的 项目一起合并。

下面是一些职位给一些反馈和解释子树的优点超过子模块:

一个非常有趣的(有点热)线,从git的邮件列表,讨论利弊和git-子树的利弊和子模块

+0

这是一个(很大的)缺点,即子树不是内置在git中,但是子树听起来像是更容易,并且比子模块更不容易出现头痛。我几乎在想,远程仓库(被主仓库忽略的.gitignore)会消除子模块的问题,比子树有更多的开销(但避免了维护子树安装的问题),并且可以面向未来后续版本的git可能会使子树过时。 – 2011-06-08 20:56:42

+0

@Jonathon:我添加了一个链接到git mlist中的一个线程,从核心技术角度讨论这两个特性。 – nulltoken 2011-06-10 09:06:26

+0

讨论很有趣,但对于不熟悉git及其内部的人来说,我不可能知道哪个更“好”。你有子树的作者强烈地争论为什么子模块被破坏,并且Linus Torvalds(git的原始作者)评论那种基于树的存储(如子树)是内在地被破坏的。我读得越多,似乎这两个选项都不值得麻烦,我应该只使用远程存储库。 – 2011-06-11 02:25:37