在执行 git svn clone 命令时如何过滤掉删除记录?

6
问题:遗留的 svn 仓库有一个目录是从生产服务器上的用户配置同步过来的。
同步实际上:
  • 删除所有文件
  • 提交
  • 复制所有文件
  • 提交
在 git svn 克隆这个仓库时,是否可以过滤掉所有文件删除操作?
并且在后续的 git svn 拉取中也一样?
我不想过滤整个提交,只需要过滤删除文件的部分。
这意味着后续添加文件将变为修改文件。
1个回答

1

首先,如果你想要更多地控制你的仓库转换,你可能需要考虑使用 Reposurgeon而不是git-svn。


由于Git的工作方式,这些不良实践在SVN中的影响要比你想象的少得多。
首先,Git本身没有“文件历史”概念。就像在SVN或其他版本控制系统中一样,不存在“文件修改”的概念。Git只记住文件树。然后是另一个文件树。等等。
如果将HEAD与HEAD^^(其中HEAD^是介于两者之间的“删除”提交)进行比较,您将得到与完全省略“删除”修订版时相同的结果。
此外,存储要求也不会很大——Git存储整个对象,并在制作包时对它们进行比较,而SVN使用增量压缩(因此依赖于该文件历史)。树A+空树+树B(由大部分相同的文件组成)将占用非常小的额外空间,与省略空树修订版相比。

这里的问题是拥有文件的有用历史记录。这不是一个仓库转换,而是一个仓库镜像。SVN仓库仍在积极接收SVN提交。我已经向维护者提出了这个问题,但解决方案被安排为低优先级。 - Gabriel
这三个来源的SVN提交实际上是交错的。我能否找到一种方法来解开它们的交错?创建三个镜像,每个镜像都带有一个偏移量,以便每个镜像都接收每三个提交中的一个? - Gabriel
实际上,每个源都有一个独特的提交消息,每次使用相同的消息。因此,也许我只需要根据提交消息将提交筛选到三个新的存储库中? - Gabriel
我认为git read-tree可能是你想要的 - 可以参考我的博客获得灵感:http://strangeowl.blogspot.co.uk/2013/04/grafting-history-with-git.html?m=1 - Adrian
假设我有一个 git 仓库,其中包含三个提交源:Alpha、Beta 和 Gamma。他们都将 foo@bar 作为他们的姓名和电子邮件。每天,每个提交源都会擦除目录,复制自己独特的文件,然后提交。每个提交源分别应用其名称的消息。 如何将其拆分为三个新的 git 仓库,分别只包含一个提交源的提交,例如仅包含 Alpha 的提交的仓库,仅包含 Beta 的提交的仓库以及仅包含 Gamma 提交的仓库? - Gabriel
1
如果每个提交者都可以轻松识别,您可以采用我的方法来合并与分割链接的分支;发出提交/树SHA1的日志,带有标识提交者或以其他方式允许您过滤它们的附加字段,然后使用grep将行拆分为自己的文件。使用每个文件来驱动git read-tree / git commit对,以形成仅包含所需提交的新分支。 - Adrian

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