仅使用Git合并修改过的文件

4
我有一个包含内容和源文件的存储库。开发人员应仅在源文件上工作。为了节省空间,开发人员不应将内容文件(大小为GB)克隆到其本地存储库中。源文件不是作为子模块出现在项目中,而是与内容位于同一位置。
我的方法是这样的 - 我从主分支创建了一个名为“Source”的分支,然后从该分支中删除了内容文件。我发布了相同的分支供开发人员克隆。
当我将来自“Source”分支的更改合并回“Master”时,“Master”中的内容文件将被删除。如何限制它?如果不可能,那么是否有一种方法可以实现我的要求,即拥有一个仅包含过滤文件(即源文件)的单独分支/克隆?
4个回答

5
明显的答案是您应该拥有单独的源代码仓库和内容仓库。或者只需让内容保持不变。

应用程序框架不允许将源文件与内容分开。我能否使用Git根据文件模式(例如,.java、.groovy等用于源文件和其余用于内容)创建单独的存储库来处理相同的源代码? - kaychaks
+1 同意。在我的 CMS 项目中,我有一个根项目,其中包含代码,一个测试项目,其中包含用于测试的小示例数据文件,以及一个内容项目,这是主要的,并且仅包含配置和内容。 - Aaron Digulla
1
@kaychaks:获取应用程序框架的源代码并修复错误。如果无法获取源代码,请提交错误报告。 - Aaron Digulla
@kaychaks:在同一个文件夹或子文件夹中混合多个代码库通常是一个非常糟糕的想法。即使可以这样做,也会引发问题。 - Oddmund

2

您根本不应该从Source分支中删除文件。如果SourceMaster只是同一存储库中的分支,则开发人员将始终拥有这些内容;保留这些内容没有任何损害。


内容文件的类型包括flv、wmv、pdf和doc,大小超过200GB。在远程克隆期间,这将对网络造成巨大的负担,因为它是跨地点开发团队。我认为,Git扫描如此庞大数量的文件以检测某些源文件的更改也将成为性能瓶颈。 - kaychaks
“你这么认为”?所以你在没有先检查是否真的存在问题的情况下就开始行动了?呃。1)我的观点仍然成立:如果Source和Master是同一存储库中的分支,它们将被克隆到开发人员的计算机上。 2)您计划多久克隆完整的存储库? 3)Git首先使用文件修改时间;只有在这些时间不同时才会检查内容。这里没有损失。 4)让您的远程团队克隆存储库一次,然后让那边的人克隆该存储库。像吃馅饼一样容易。 - Bombe

1
使用 git-merge 合并两个分支,然后使用 git-revert 撤销删除内容文件的提交。
% git checkout Master
% git merge Source
% git revert <content-removal-commit-id>

或者你可以选择另一种方式,在合并到主分支之前,先移除内容删除的提交。这样做可能会更加复杂,但可以使你的主分支历史记录更加清晰。

% git checkout Source
% git branch SourceMerge
% git checkout SourceMerge
% git revert <content-removal-commit-id>
% git checkout Master
% git merge SourceMerge

0

你确定要将那些媒体/文档文件包含在你的代码库中吗?你想要跟踪一个200GB的媒体库的变化吗?

如果你在源分支上把它们所在的目录引用放在.gitignore文件中,git就会忽略这些文件,因此不会触及或删除它们。

http://git-scm.com/docs/gitignore


它只会忽略未被跟踪的文件——我认为它们不是。 - Bombe

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