git松开了SVN标签之间的历史记录

内酯

我的git仓库正在跟踪SVN仓库。我的git分支之一,我们称其为“ latest_tag”,它指向源代码,就像最新的SVN标签中的那样。创建新的SVN标签后,我想将更改合并到“ latest_tag”中。当我尝试执行此操作时,git抱怨合并冲突,好像它对SVN历史不了解。

SVN存储库使用的是标准结构。

树干/
标签/
 -v1
分支机构/

我以通常的方式创建了git repo。

git svn clone --stdlayout url_to_svn_repo git_repo

我为每个SVN标签创建了git分支,并创建了一个“ latest_tag”分支。

git branch v1 tags/v1
git branch latest_tag v1

当在SVN仓库(例如v2)中添加了新标签时,我可以将其导入git仓库。

git svn fetch
git branch v2 tags/v2

但是,如果我尝试将'latest_tag'分支从v1快进到v2,则会收到错误消息。

$ git checkout latest_tag
$ git merge v2
Auto-merging source.py
CONFLICT (add/add): Merge conflict in source.py
Automatic merge failed; fix conflicts and then commit the result.

当我查看冲突时,尽管git和v2之间有共同的历史记录,但git似乎认为v1和v2之间的所有更改都是不相关的。

这是重新创建问题的最小脚本。

# Create the svn repo and its first tag.
svnadmin create svn_repo/
svn checkout "file:///${PWD}/svn_repo/" svn_working_copy
( cd svn_working_copy ; mkdir -p trunk tags branches ; svn add * ; svn commit -m 'Initialize SVN repo' ; cd trunk ; echo "print 'Hello v1'" >source.py ; svn add * ; svn commit -m 'Development for v1' ; cd .. ; svn cp trunk/ tags/v1 ; svn commit -m 'Tag v1' ; sed --in-place 's/v1/v2/' trunk/* ; svn commit -m 'Development for v2' ; )

# Create a git repo from the svn repo.
git svn clone --stdlayout "file://${PWD}/svn_repo/" git_repo
( cd git_repo ; git branch v1 tags/v1 ; git branch latest_tag v1 )

# Create tag v2 in svn.
( cd svn_working_copy ; svn cp trunk/ tags/v2 ; svn commit -m 'Tag v2' )

# Merge or rebase 'latest_tag' git branch on svn tag v2.
( cd git_repo ; git svn fetch ; git branch v2 tags/v2 ; git checkout latest_tag ; git merge v2 )

编辑我确认git似乎对两个SVN标签之间的共同历史没有任何了解。

$ git log --oneline master
bd050cd Development for v2
373f808 Development for v1
3b92703 Initialize SVN repo
$ git log --oneline remotes/tags/v1
31f9fff Tag v1
3b92703 Initialize SVN repo
$ git log --oneline remotes/tags/v2
b717759 Tag v2
3b92703 Initialize SVN repo

如果git了解SVN历史记录,它将输出此内容。

$ git log --oneline remotes/tags/v1
31f9fff Tag v1
373f808 Development for v1
3b92703 Initialize SVN repo
$ git log --oneline remotes/tags/v2
b717759 Tag v2
bd050cd Development for v2
373f808 Development for v1
3b92703 Initialize SVN repo
内酯

我发现为什么git似乎对svn历史一无所知。答案是:这取决于您如何创建svn标签。

回顾svn历史,我看到svn标记是作为各种修订版本的文件组成而创建的,而不是作为给定修订版本的快照创建的。

$ svn log -v
------------------------------------------------------------------------
r3 | lacton | 2013-07-27 18:15:20 | 1 line
Changed paths:
   A /tags/v1 (from /trunk:1)
   A /tags/v1/source.py (from /trunk/source.py:2)

Tag v1
------------------------------------------------------------------------

尽管svn对此感到非常满意,但是git-svn对此感到困惑。

svn update创建标签之前添加可以解决此问题。

$ svn up
At revision 2.
$ svn cp trunk/ tags/v1
A         tags/v1
$ svn commit -m 'Tag v1'
Adding         tags/v1

Committed revision 3
$ svn up
At revision 3.
$ svn log -v -r HEAD
------------------------------------------------------------------------
r3 | lacton | 2013-07-27 18:20:26 | 1 line
Changed paths:
   A /tags/v1 (from /trunk:2)

Tag v1
------------------------------------------------------------------------

使用此修复程序,git-svn可以正确解释svn标签历史记录,并且不再存在合并冲突。

这是svn update初始问题提供的最小脚本的“ git-friendly”版本(即,在创建标签之前)。

# Create the svn repo and its first tag.
svnadmin create svn_repo/
svn checkout "file:///${PWD}/svn_repo/" svn_working_copy
( cd svn_working_copy ; mkdir -p trunk tags branches ; svn add * ; svn commit -m 'Initialize SVN repo' ; cd trunk ; echo "print 'Hello v1'" >source.py ; svn add * ; svn commit -m 'Development for v1' ; cd .. ; svn up ; svn cp trunk/ tags/v1 ; svn commit -m 'Tag v1' ; sed --in-place 's/v1/v2/' trunk/* ; svn commit -m 'Development for v2' ; )

# Create a git repo from the svn repo.
git svn clone --stdlayout "file://${PWD}/svn_repo/" git_repo
( cd git_repo ; git branch v1 tags/v1 ; git branch latest_tag v1 )

# Create tag v2 in svn.
( cd svn_working_copy ; svn up ; svn cp trunk/ tags/v2 ; svn commit -m 'Tag v2' )

# Merge or rebase 'latest_tag' git branch on svn tag v2.
( cd git_repo ; git svn fetch ; git branch v2 tags/v2 ; git checkout latest_tag ; git merge v2 )

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

svn到git migration:不完整的历史记录

git p4:迁移完整历史记录-包括集成历史记录

如何检出包含所有历史记录,标签和版本的整个SVN存储库

大量git历史记录重写后如何同步本地历史记录?

完整历史记录

了解Git历史记录图

编辑git历史记录的影响

如何修复git历史记录并正确合并无关的历史记录

master标签在Visual Studio 2019中的Git历史记录中意味着什么?

VsCode SVN显示历史记录

如何使用git svn重写/重新排序/压缩svn提交历史记录?

使用分支的历史记录在分支之间移动单个Git文件

如何浏览某些行号之间的bash历史记录

在Zsh和Bash之间共享或同步历史记录

SVN到Git:仅保留具有“基本”历史记录的中继内容

恢复SVN中已删除文件的历史记录

Firefox:在标签历史记录中隐藏about:newtab

使用非标准的SVN布局从SVN迁移到Git(需要完整的历史记录)

使用过滤的历史记录将SVN迁移到Git

使用JS代码清除Chrome标签历史记录

在单个SVN分支上进行GIT迁移-无法获取中继的所有历史记录

添加缺少的git历史记录

Firefox:在标签中打开历史记录

如何保存zsh终端之间的历史记录?

查看谁都打开了特定文件的历史记录

需要已经迁移的 SVN-GIT 的历史记录

Windows 上的 OpenGrok - 未启用 svn 历史记录

我想将 svn 项目复制到带有历史记录的 git

如何恢复删除历史记录的分叉的 git 历史记录?