【问题标题】:Can one git branch bloat another in the same remote?一个 git 分支可以在同一个遥控器中膨胀另一个吗?
【发布时间】:2017-07-08 06:24:57
【问题描述】:

我在origin 远程有一个带有master 分支的git 存储库。团队中的其他开发人员正在将他们自己的 dev/feature 分支推送到同一个远程。最终这些分支要么被丢弃,要么squash-合并到master 中,然后被删除。

现在团队中的一些开发人员不熟悉 git,并且可能会通过添加二进制文件等来膨胀其功能分支的历史记录。最终他们会发送一个拉取审查请求,必须对其进行审查,并且审查者将强制执行该请求没有添加任何二进制文件。

在这种情况下,我预计 dev/feature 分支会膨胀(例如 git 可能会变慢,拉取/克隆它们可能需要一段时间,等等)。问题是这是否会导致人们在同一个遥控器中与其他不臃肿的分支一起工作时出现任何性能问题。

【问题讨论】:

  • 考虑在二进制文件中使用git-lfs,以避免在版本控制中仍有二进制文件时出现回购膨胀。
  • 如果你没有任何Git本身没有的分支访问控制机制,其他开发者在clone/pull/fetch时也会得到二进制相关的Git数据。

标签: git


【解决方案1】:

问题是这是否会导致人们在同一个遥控器中使用其他不臃肿的分支时出现性能问题。

如果膨胀的分支被推送,是的,它会影响其他的性能,但仅限于git fetch(包括git pull)。默认情况下,它将下载每个分支的全部历史记录和全部内容。有多种解决方法,比如git clone --single-branch 只获得master,但下面有更好的解决方案。

但不应该影响其他操作。 git diffgit log 等...应该基本不受影响。

与其阻止人们将二进制文件置于版本控制中,或者只克隆某些分支,不如使用git-lfs。这是两全其美的。您可以将二进制文件置于版本控制中,但实际内容存储在存储库之外以避免存储库膨胀。

【讨论】:

  • git-lfs 是一个不错的选择,但据我所知,我们必须设置一组路径 glob 模式,以便 git-lfs 跟踪(例如 *.png、*.a)。我担心人们最终会不可避免地提交绕过我们设置的所有模式的二进制文件。
  • @roim 有了一个不错的网络,如果偶尔出现二进制提交应该不是问题。您可以使用 BFG 追溯修复它。而且由于您正在合并分支,因此该分支中的任何臃肿历史都将被垃圾收集。
  • 啊,所以我想我从答案中错过了这一点:当功能分支被删除/垃圾收集时,膨胀就会结束。是这样吗?如果是这样,可能值得添加到答案中,即使我们最终没有使用 git-lfs,我也会在晚上睡得很好。我喜欢 lfs 的想法,但在我的环境中对它的支持仍然是实验性的。
  • 是的,一旦分支被删除并离开服务器,服务器端膨胀就会结束。不过,用户还必须删除 他们 拥有的任何名称(例如远程跟踪分支名称),这些名称将这些提交保存在 他们自己的 存储库中,以收回他们的空间。他们可以通过运行git fetch --prune 自动执行此操作(“prune” = “如果foo 继续使用origin,请立即删除我的origin/foo”,可以说应该是默认设置)。不过,提供一个默认拒绝大文件的服务器端预接收或更新挂钩也可能是明智的。
  • @roim 那只是因为你正在压缩合并,并且不推荐压缩合并正是因为这个原因:它丢失了重要的历史记录。 Torek 建议的服务器端钩子拒绝大文件,除非它们在 git-lfs 下,这似乎是最好的解决方案。
猜你喜欢
  • 2014-12-09
  • 2018-09-11
  • 1970-01-01
  • 2014-08-11
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
相关资源
最近更新 更多