如何处理具有git-svn和纯git遥控器的git

时间:2014-08-05 11:14:18

标签: git svn git-svn

我有两个存储库,一个仍然是 svn 并充当主要位置,另一个是纯 git ,其中是日常工作。我使用git svn clone svn+ssh://...进行了本地克隆,并使用git remote add git@...添加了一个遥控器。

在对其提交和分支进行重构之后, git master已经修改了目录结构,当我尝试git svn dcommit时出现了一堆冲突,看起来像是一个rebase SVN 。它就像 mv 的文件和目录一样,重命名和重新定位都会丢失。

我阅读的解决方案看起来来自同时提交两个遥控器的情况,甚至这可能会导致问题。有没有办法告诉 git-svn 表现得像策略是将svn转换为git有什么

更新@ 20140821

过了一段时间,我发现它对我有用,但我不确定这是否足够通用。

在我的情况下,我同时拥有相同提交的遥控器,就是在我执行push之前或之后我执行dcommit。然后我可以强迫自己总是从git开始,然后继续使用svn。

看起来像:

git svn fetch
git fetch gitremote
git add file1 file2
git commit -m "something descriptive but concise"
git push gitremote branch
git svn dcommit

我发现将提交首先发送到svn的唯一方法是在推送中使用选项 - force ,否则status命令包括消息:

# Your branch and 'gitremote/branch' have diverged,
# and have 3 and 2 different commits each, respectively.

任何尝试合并都会显示commit中所做的所有更改,例如new。但是如果git存储库中存在其他更改(例如,另一个开发人员已经在那里推送了某些内容),则此 force 会出现一个大问题,然后此强制可能会覆盖这些更改。

1 个答案:

答案 0 :(得分:0)

为了避免在git远程端重写历史记录(git push),你可以简单地进行合并。在最简单的情况下,您将更改推送到svn/branch并且具有相应的git_remote/branch,但没有区别:

git checkout git_remote/branch
# -s ours to ignore potential conflicts, assuming git diff is empty
git merge -s ours svn/branch
git push git_remote HEAD:branch