我阅读了Git手册、常见问题解答、Git-SVN速成课程等,他们都解释了这一点和那一点,但你找不到像这样的简单说明:
SVN存储库位于:svn://myserver/path/to/svn/repos
Git存储库位于:git://myserver/path/to/git/repos
git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos
我不希望它这么简单,也不希望它是一个命令。但我确实希望它不要试图解释任何事情——只是说在这个例子中应该采取什么步骤。
实现这一目标有不同的方法。我尝试了其中的一些,发现在Windows操作系统上只安装了git和svn就可以了。
前提条件:
windows上的git(我用过这个)https://git-scm.com/ 安装了控制台工具的svn(我使用过乌龟svn)转储SVN存储库的文件。svnadmin转储/path/to/repository>repo_name.svn_dump
实现最终目标的步骤(将所有具有历史记录的存储库移动到git,首先是本地git,然后是远程git)
在REPO_NAME_FOLDER目录中创建空存储库(使用控制台工具或tortoiseSVN)cd REPO_NAME_PARENT_FOLDER,将dumpfile.dump放入REPO_NAME_PARENT_FOLDsvnadmin load REPO_NAME_FOLDER<dumpfile.dump等待此操作,可能需要很长时间此命令是无声的,因此打开第二个cmd窗口:svnserve-d-R--root REPO_NAME_FOLDER为什么不直接使用file:///...... ? 因为下一个命令将失败,无法打开。。。到URL:,感谢您的回答https://stackoverflow.com/a/6300968/4953065创建新文件夹SOURCE_GIT_foldercd源_GIT_FOLDERgit-svn克隆svn://localhost/等待此操作。
最后,我们得到了什么?
让我们查看本地存储库:
git log
看到您以前的提交吗?如果是-好
现在,您已经拥有了功能齐全的本地git存储库,其中包含您的源代码和旧svn历史记录。现在,如果要将其移动到某个服务器,请使用以下命令:
git remote add origin https://fullurlpathtoyourrepo/reponame.git
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags
在我的情况下,我不需要标签命令,因为我的repo没有标签。
祝你好运
只使用git、SVN和bash的稍微扩展的答案。它包括SVN存储库的步骤,这些存储库不使用带有主干/分支/标签目录布局的常规布局(SVN绝对不执行这种布局)。
首先使用此bash脚本扫描SVN repo以查找不同的贡献者,并为映射文件生成模板:
#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
echo "${author} = NAME <USER@DOMAIN>";
done
使用此选项可以创建一个作者文件,在该文件中,您可以使用git-config财产user.name和user.email将svn用户名映射到开发人员设置的用户名和电子邮件(请注意,对于GitHub这样的服务,只有匹配的电子邮件就足够了)。
然后让git-svn将svn存储库克隆到git存储库,告诉它映射:
git-svn clone--authors file=authors--stdlayoutsvn://example.org/Folder/projectroot
这可能需要非常长的时间,因为git-svn将单独检查存在的每个标记或分支的每个修订。(请注意,SVN中的标记实际上只是分支,因此它们在Git中最终也是如此)。您可以通过删除SVN中不需要的旧标记和分支来加快速度。
在同一网络中的服务器上或同一服务器上运行它也可以真正加快速度。此外,如果由于某种原因,此过程中断,您可以使用
git-svn-rebase--继续
在很多情况下,你已经在这里完成了。但是,如果您的SVN回购有一个非传统的布局,您只需在SVN中有一个目录,就可以将其放入git分支中,那么您可以执行一些额外的步骤。
最简单的方法是在服务器上创建一个新的SVN repo,它遵循惯例,并使用SVN副本将目录放在主干或分支中。如果您的目录完全位于repo的根目录,这可能是唯一的方法,当我上次尝试这个git-svn时,它只是拒绝执行签出。
您也可以使用git执行此操作。对于git-svn克隆,只需使用您想要放入git分支的目录。
运行后
git branch --set-upstream master git-svn
git svn rebase
注意,这需要Git1.7或更高版本。
我建议在尝试经常使用Git-svn之前,先熟悉Git,即保持svn作为集中存储库并在本地使用Git。
然而,对于具有所有历史记录的简单迁移,以下是几个简单步骤:
初始化本地回购:
mkdir project
cd project
git svn init http://svn.url
标记要开始导入修订的时间:
git svn fetch -r42
(或仅对所有版本使用“gitsvn-fetch”)
事实上,从那时起,获取一切:
git svn rebase
您可以使用Gitk检查导入的结果。我不确定这是否适用于Windows,但适用于OSX和Linux:
gitk
当您在本地克隆了SVN repo后,您可能希望将其推送到集中的Git repo,以便于协作。
首先创建空的远程存储库(可能在GitHub上?):
git remote add origin git@github.com:user/project-name.git
然后,可选地同步您的主分支,这样当远程主机和本地主机都包含新内容时,拉操作将自动合并远程主机:
git config branch.master.remote origin
git config branch.master.merge refs/heads/master
之后,您可能会有兴趣尝试我自己的git_remote_branch工具,它有助于处理远程分支:
第一篇解释文章:“Git远程分支”
跟进最新版本:“git与git_remote_branch协作的时间”
将Subversion存储库干净地迁移到Git存储库。首先,您必须创建一个将Subversion提交作者名称映射到Git commiters的文件,比如~/authors.txt:
jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>
然后您可以将Subversion数据下载到Git存储库中:
mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch
如果您在Mac上,可以通过安装git-core+svn从MacPorts获取git-svn。
如果您的subversion存储库与所需的git存储库位于同一台机器上,那么您可以在init步骤中使用此语法,否则都一样:
git svn init file:///home/user/repoName --no-metadata
我使用以下脚本读取了一个包含所有SVN存储库列表的文本文件,并将其转换为Git,然后使用gitclone--bare将其转换成Git存储库:
#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
printf '%s\n' "$repo_name"
sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name
sudo git clone --bare /programs/git/$repo_name $repo_name.git
sudo chown -R www-data:www-data $repo_name.git
sudo rm -rf $repo_name
done <"$file"
list.txt的格式为:
repo1_name
repo2_name
users.txt的格式为:
(无作者)=罗杰斯王子<prince.rogers.nelson@payesley.park.org>
www数据是Apache web服务器用户,需要权限才能通过HTTP推送更改。