我在一个相当大的repo(~8000提交)上运行git filter-branch
以删除某些二进制文件,但现在当我git svn rebase
保持我的repo更新时,它会产生一个巨大的列表冲突我猜这是因为这两个命令都涉及重写历史。
有没有办法在没有这些冲突的情况下我的过滤器分支后可以从SVN同步到Git?未来的任何改变也会导致这样的问题吗? (我只是从SVN到Git的同步方式)
答案 0 :(得分:1)
已发送给SVN的提交(通过git svn dcommit)不应进一步更改,因为它会导致您看到的冲突。
在一个只有git的场景中,你理论上可以做一个git push -force(虽然如果你通过那个repo与其他人一起工作就不鼓励它),但是SVN不允许这样做。 / p>
因此,您无法重写已经发送到subversion服务器的内容。如果二进制文件位于subversion服务器上,则filter-branch无论如何都不会帮助你。另外,如果您在服务器上使用SVN工具来删除二进制文件,则需要重新检查git副本 - 此时git-svn数据将无效。
现在只能将主分支重置为origin / trunk。
编辑: 至于新出现的冲突,我的猜测是过滤器分支会混淆$ GIT_DIR / svn / ** /。rev_map。*中git提交和svn修订号之间的关系。(参见git-scm.com/docs/git -svn:CAVEATS / FILES)。 此外,如果SVN端对您在git副本中删除的文件进行了更改,则自然会发生冲突。
答案 1 :(得分:1)
正如我所看到的那样,您无法使template<typename...> // parameter pack here
using void_t = void;
template<typename T, typename = void>
struct has_xxx : std::false_type {};
template<typename T>
struct has_xxx<T, void_t<decltype(&T::xxx)>> :
std::is_member_function_pointer<decltype(&T::xxx)>{};
和filter-branch
兼容。您正在重写与远程关系的历史记录。因此,您更改提交哈希并使SVN rev_map的映射完全无用。
如果您在svn rebase
之后移除了遥控器,那将是一个不同的故事,在这种情况下它根本无关紧要,但就目前而言,我看到没办法来完成这项工作