使用 "git svn",我能在获取时忽略特定的 Git 提交吗?

7
我在本地机器上使用 git svn 与 SVN 存储库同步。最近,我的团队中有人向 SVN 存储库添加了一些实验性的东西(他试图添加一些标签),但在下一个提交中将其删除。此后,我的 git svn 拒绝抓取。它只到达某个点并停留在那里。无论如何,我不想将所有实验性内容都抓取到我的本地机器上。因此,我希望能够忽略 SVN 存储库中的某些提交。使用 git svn 是否可以实现这一点?
4个回答

12

假设我们需要跳过提交666,技巧在于使git获取除了666之外的所有提交。幸运的是,git-svn给了我们-r参数。

首先,更新到要跳过的提交之前的提交:

git svn fetch -r BASE:665

然后,将坏提交后的所有内容更新到Subversion tip:

git svn fetch -r 667:HEAD

这样可以让你拥有除了你想要跳过的提交之外的所有版本库。如果必要,你可以跳过多个修订版本,只需为你想保留的任何时间范围重复上述命令即可。

如果你跳过将受后续修订版本影响的文件更改(例如,你跳过了一个文件更改或创建,并且该文件在你获取的修订版本中稍后发生更改),则跳过修订版本可能会出现问题。

也就是说,我刚刚做了这件事情,跳过了一个修订版本,其中某人已将整个Subversion存储库复制到tags/目录中,然后删除了显然无效的标签。我使用了上述技巧来跳过创建无效标签的修订版本(Git 一直在尝试下载整个存储库),让它获取删除(它只是忽略了它),一切都没问题了。


1
请记住,此时您不再需要指定要获取的svn仓库。使用给定的命令,而不是像我尝试的那样(将svn仓库的位置添加到命令的末尾)... - AndrewW

3

在尝试实验性提交之前,您可以尝试重置git-svn并重新获取。

git svn reset -r665
git svn fetch 

如果问题仍然存在并且似乎是永久性的(可能是一些文件访问修改),您可以尝试另一种方法。

首先,将代码重置为恶意提交之前的最新提交。

git svn reset -r665

然后尝试重新获取,完全忽略开发人员在邪恶提交中更改的所有文件。
git svn fetch --ignore-paths='/path/to/problematic/files'

那么,将回滚恶意提交后的第一个普通提交重置。

git svn reset -r668

重新获取所有内容。
git svn fetch

我建议r666是恶意提交,而r667是撤消它的提交。


当您想要还原某些更改时,这也是可用的。只需不要忘记遵循清理过程(类似于此)的步骤:http://www.ducea.com/2012/02/07/howto-completely-remove-a-file-from-git-history/ - ony

0

我曾经遇到过同样的问题,发现自己不得不不停地重新运行fetch。但后来我发现有其他未完成的git svn fetch操作在后台运行。将这些进程杀死似乎解决了问题。


-2
你可以再次克隆存储库并使用深度参数来指定年龄...
git clone --depth 3 // Gets the last 3 revisions

或者使用 git svn clone --depth 3 命令进行 git svn 克隆。 - Chris Pont
哦..我有一个已经存在的仓库,里面已经有很多提交记录了,我已经将它们克隆到了我的本地机器上..我只想在获取时忽略一些主要SVN分支中的修订。 - CSS

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