我将 SVN 存储库迁移到 Git 并将其推送到中央存储库。我们有相当数量的标签和分支,但不知何故,我们无法从 Git 客户端列出和获取它们。这很奇怪,因为标签和分支似乎在服务器上可用。
在一个人的帮助下乔恩·马多克斯博客文章, a Marc Liyanage 的博客文章 and a 所以凯西的回答我能够将解决方案缝合在一起。感谢您的帮助!
这就是我最终所做的。首先,我使用 svn 提交者创建了一个文件:
local$ svn log svn://server/opt/svn/our_app |grep ^r[0-9] | cut -f2 -d\| |sort |uniq | tee ~/users.txt
alice
bob
eve
local$ vim ~/users.txt
local$ cat ~/users.txt
alice = Alice Malice <[email protected]>
bob = Bob Hope <[email protected]>
eve = Eve Leave <[email protected]>
然后我从我们的 svn 存储库创建了一个 git 存储库:
local$ mkdir our_app
local$ cd our_app
local$ git svn init --stdlayout svn://server/opt/svn/our_app
local$ git config svn.authorsfile ~/users.txt
local$ git svn fetch
local$ git svn create-ignore
local$ git commit -m 'added .gitignore, created from svn:ignore'
local$ for remote in `git branch -r`; do git checkout -b $remote $remote; done
最后一步至关重要,因为否则从远程存储库克隆时分支/标签将不可用。不管怎样,我把它推送到了一个新的远程仓库:
local$ ssh server
server$ mkdir /opt/git/our_app.git
server$ cd /opt/git/our_app.git
server$ git --bare init
server$ git config core.sharedrepository 1
server$ git config receive.denyNonFastforwards true
server$ find objects -type d -exec chmod 02770 {} \;
server$ exit
local$ git remote add origin ssh://server/opt/git/our_app.git
local$ git push --mirror
远程存储库的新克隆显示一切都可用:
local$ git clone ssh://server/opt/git/our_app.git
local$ cd our_app
local$ git branch -a
* master
remotes/origin/master
remotes/origin/pre-svn-move
remotes/origin/tags/mytag-0.1
remotes/origin/tags/mytag-0.2
remotes/origin/trunk
remotes/origin/mybranch-1
remotes/origin/mybranch-2
现在可以签出远程分支:
local$ git checkout -t origin/mybranch-1
local$ git branch
master
* mybranch-1
重申一下:本指南包括有关远程标记和分支可用性、镜像到远程存储库以及重用 svn:ignore 中的值的提示。我之前没有在一本指南中找到所有这些内容。
最后一点:ebneter 关于 svn2git 的提示也很棒,因为这个实际上将标签保留为标签,而 git-svn 将它们转换为分支。另一方面,我无法让“git svn create-ignore”与 svn2git 一起使用......