在Git中跨分支共享文件

时间:2011-06-03 18:03:43

标签: git version-control branch git-branch

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

我想在源代码管理中使用这些东西,但我不希望各个分支跟踪对它们的更改。

你如何处理这种情况?

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

.gitignore是我唯一的选择吗?

6 个答案:

答案 0 :(得分:4)

您是否考虑过git-subtree

,而不是依赖于子模块

documentation中所述:

  

不要将子树混淆   子模块,用于   同样的任务。

     

与子模块,子树不同   不需要任何特殊结构   (比如.gitmodule文件或gitlinks)   存在于您的存储库中,而不是   强制您的存储库的最终用户   做任何特别的事情或理解   如何使用子树。

     

子树只是一个   可以提交的子目录,   分支,并与您的合并   以任何你想要的方式投射。

以下是一些帖子,提供了一些反馈并解释了子模块在子模块上的优点:

一个非常有趣(有点激烈)的帖子,来自git mailing-list,讨论git-subtree和submodule的优点和缺点

答案 1 :(得分:2)

将构建脚本和批处理文件保存在单独的仓库中吗?

答案 2 :(得分:2)

其他答案并没有像我想的那样干净利落地解决我的问题,但是他们确实让我去研究更多的选择。

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

没有内置方法可以选择应在源代码管理中维护并独立于其他各个分支进行管理的文件集。

在我的项目中,几乎所有共享文件都在一个特定的子目录中。虽然源树的其余部分可以更改并且应该由各个分支进行管理,但是可以在各个分支之间共享此“配置”文件集,以使存储库保持“活动”状态。

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

您可以通过设置跟踪文件的skip-worktree位来实现与.gitignore文件相同的效果。

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

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

答案 5 :(得分:0)

我会创建一个分支来包含所有这些共享文件。每当分支需要共享文件时,它都可以使用

来获取它
git checkout workingbranch
git checkout sharedbranch <needed file>

稍后您只需使用相同的命令

即可更新
git checkout sharedbranch <needed file>