Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将具有历史记录的SVN存储库迁移到新的Git存储库?_Svn_Git_Version Control_Git Svn - Fatal编程技术网

如何将具有历史记录的SVN存储库迁移到新的Git存储库?

如何将具有历史记录的SVN存储库迁移到新的Git存储库?,svn,git,version-control,git-svn,Svn,Git,Version Control,Git Svn,我阅读了Git手册、常见问题解答、Git-SVN速成课程等,它们都解释了这一点和那一点,但没有任何地方可以找到像以下这样的简单说明: SVN存储库位于:svn://myserver/path/to/svn/repos git-do-the-magic-svn-import-with-history \ svn://myserver/path/to/svn/repos \ git://myserver/path/to/git/repos Git存储库位于:git://myserver/path/

我阅读了Git手册、常见问题解答、Git-SVN速成课程等,它们都解释了这一点和那一点,但没有任何地方可以找到像以下这样的简单说明:

SVN存储库位于:
svn://myserver/path/to/svn/repos

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/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
我不希望它这么简单,也不希望它是一个单一的命令。但我希望它不会试图解释任何事情——只是说在这个例子中应该采取什么步骤。

Magic:

$ git svn clone http://svn/repo/here/trunk
Git和SVN的操作非常不同。您需要学习Git,如果您想跟踪SVN上游的更改,您需要学习
Git SVN
。git svn的

。首先,您必须创建一个将Subversion提交作者名称映射到Git提交者的文件,例如
~/authors.txt

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>
如果您在Mac上,您可以通过安装
git-core+svn
从MacPorts获得
git-svn

如果subversion存储库与所需git存储库位于同一台机器上, 然后,您可以在初始化步骤中使用此语法,否则一切相同:

git svn init file:///home/user/repoName --no-metadata
见官员。特别是在“基本示例”下:

跟踪并参与整个Subversion管理的项目(完成 带有主干、标签和分支):


我建议在不断尝试使用Git svn之前先熟悉Git,即保持svn作为集中回购,并在本地使用Git

但是,对于具有所有历史记录的简单迁移,以下是几个简单步骤:

初始化本地回购:

mkdir project
cd project
git svn init http://svn.url
标记要开始导入修订的时间间隔:

git svn fetch -r42
(或仅针对所有转速的“git svn fetch”)

从那时起,实际获取所有内容:

git svn rebase
您可以使用Gitk检查导入的结果。我不确定这是否适用于Windows,它适用于OSX和Linux:

gitk
当您在本地克隆了SVN repo后,您可能希望将其推送到一个集中的Git repo,以便于协作

首先创建空的远程回购协议(可能在?):

然后,可以选择同步主分支,以便在远程主机和本地主机都包含新内容时,拉操作将自动合并远程主机:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master
之后,您可能会有兴趣尝试我自己的
git\u remote\u branch
工具,该工具有助于处理远程分支:

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
* master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$$ git checkout -b MyDevBranch origin/MyDevBranch
Branch MyDevBranch set up to track remote branch MyDevBranch from origin.
Switched to a new branch 'MyDevBranch'
$ git branch -a
* MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$
第一个解释性帖子:“”


最新版本的后续操作:“

GitHub现在有了一个功能。不过,我从未尝试过。

另一方面,当尝试使用git svn dcommits进行git时,git stash命令简直是天赐良机

一个典型的过程:

  • 建立git回购协议
  • 在不同的文件上做一些工作
  • 决定使用git签入一些工作
  • 决定
    svn DCOMIT
  • 获取可怕的“无法使用脏索引提交”错误 解决方案(需要git 1.5.3+):

    是对git svn的温和介绍。对于现有的SVN存储库,git SVN使这变得非常简单。如果您要启动一个新的存储库,那么首先创建一个空的SVN存储库,然后使用git SVN导入要比反向导入容易得多。创建一个新的Git存储库然后导入到SVN是可以做到的,但这有点痛苦,特别是如果您是Git新手,希望保留提交历史记录。

    创建一个用户文件(即
    users.txt
    ),用于将SVN用户映射到Git:

    user1 = First Last Name <email@address.com>
    user2 = First Last Name <email@address.com>
    ...
    
    此命令将在
    dest_dir-tmp
    中创建一个新的Git存储库,并开始提取SVN存储库。请注意,“--stdlayout”标志意味着您拥有通用的“trunk/、branchs/、tags/”SVN布局。如果您的布局不同,请熟悉
    --标记
    --分支
    --主干
    选项(一般来说
    git svn帮助

    允许使用所有通用协议:
    svn://
    http://
    https://
    。URL应该以基本存储库为目标,例如。URL字符串必须不包含
    /trunk
    /tag
    /branchs

    请注意,在执行此命令后,该操作通常看起来是“挂起/冻结”的,初始化新存储库后,它可能会被卡住很长时间,这是很正常的。最后,您将看到日志消息,表明它正在迁移

    还请注意,如果省略
    --no metadata
    标志,Git将在提交消息中附加有关相应SVN修订的信息(即
    Git SVN id:svn://svn.mycompany.com/myrepo/@

    如果未找到用户名,请更新
    users.txt
    文件,然后:

    cd dest_dir-tmp
    git svn fetch
    
    如果您有一个大型项目,您可能需要多次重复最后一个命令,直到获取所有Subversion提交:

    git svn fetch
    
    完成后,Git将SVN
    中继签出到一个新分支中。任何其他分支都设置为远程分支。您可以使用以下工具查看其他SVN分支:

    git branch -r
    
    如果要在存储库中保留其他远程分支,则需要手动为每个分支创建本地分支。(跳过trunk/master。)如果不这样做,则在最后一步不会克隆分支

    git checkout -b local_branch remote_branch
    # It's OK if local_branch and remote_branch are the same name
    
    标记作为分支导入。您必须创建一个本地分支,制作一个标记并删除该分支,才能将它们作为Git中的标记。要使用标记“v1”执行此操作:

    将您的GIT-SVN存储库克隆到干净的GIT存储库中:

    mkdir repo && cd repo
    git svn init http://subversion/repo --no-metadata
    git config svn.authorsfile ~/authors.txt
    git svn fetch
    
    svn log -q | awk -F '|' '/^r/ {gsub(/ /, "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt
    
    git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp
    
    git clone dest_dir-tmp dest_dir
    rm -rf dest_dir-tmp
    cd dest_dir
    
    git remote rm origin
    
    先前从远程分支创建的本地分支将仅作为远程分支复制到新的克隆存储库中。(跳过主干/主分支。)对于要保留的每个分支:

    git checkout -b local_branch origin/remote_branch
    
    最后,从指向现在已删除的临时存储库的干净Git存储库中删除远程存储库:

    mkdir repo && cd repo
    git svn init http://subversion/repo --no-metadata
    git config svn.authorsfile ~/authors.txt
    git svn fetch
    
    svn log -q | awk -F '|' '/^r/ {gsub(/ /, "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt
    
    git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp
    
    git clone dest_dir-tmp dest_dir
    rm -rf dest_dir-tmp
    cd dest_dir
    
    git remote rm origin
    
    我使用了,工作起来很有魅力。

    Pro Git 8.2对此进行了解释:

    我强烈推荐我刚刚发现的这个。作者带你通过t
    /trunk
      /Project1
      /Project2
    /branches
         /Project1
         /Project2
    /tags
     /Project1
     /Project2
    
    /Project1
         /trunk
         /branches
         /tags
    /Project2
         /trunk
         /branches
         /tags
    
    Ex: ./migration https://svnurl.com/basepath project1
    
    Ex: ./migration https://svnurl.com/basepath .
    
    #!/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 branch --set-upstream master git-svn
    git svn rebase
    
    git
    git-svn
    
    svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt
    
    jwilkins = jwilkins <jwilkins>
    
    jwilkins = John Albin Wilkins <johnalbin@example.com>
    
    git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp
    
    cd ~/temp
    git svn show-ignore > .gitignore
    git add .gitignore
    git commit -m 'Convert svn:ignore properties to .gitignore.'
    
    git init --bare ~/new-bare.git
    cd ~/new-bare.git
    git symbolic-ref HEAD refs/heads/trunk
    
    cd ~/temp
    git remote add bare ~/new-bare.git
    git config remote.bare.push 'refs/remotes/*:refs/heads/*'
    git push bare
    
    cd ~/new-bare.git
    git branch -m trunk master
    
    cd ~/new-bare.git
    git for-each-ref --format='%(refname)' refs/heads/tags |
    cut -d / -f 4 |
    while read ref
    do
      git tag "$ref" "refs/heads/tags/$ref";
      git branch -D "tags/$ref";
    done
    
    bash
    git svn clone --stdlayout --no-metadata -A users.txt 
    http://svn.domain.com.au/svn/repository/favourite-project
    cd favourite-project
    git remote add gitlab git@git.domain.com.au:dev-team/favourite-project.git
    git push --set-upstream gitlab master
    
    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo
    
    subgit import  directory/path/Local.git.Repo
    
    start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo
    
    start    subgit import  directory/path/Local.git.Repo
    
    $ git remote add origin url://your/repo.git
    
    git config --global http.postBuffer 1073741824
    
    git push origin --mirror
    
    git push origin --all
    git push origin --tags
    
    git log
    
    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
    
    git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame
    
    cd gitreponame
    git svn fetch
    
    git svn rebase
    
    cp .git/refs/remotes/origin/* .git/refs/heads/
    
    git for-each-ref refs/remotes/origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done
    
    git remotes add newrepo git@github.com:aUser/aProjectName.git
    git push newrepo refs/heads/*
    git push --tags newrepo
    
    $ git remote add origin https://github.com/pankaj0323/JDProjects.git
    $ git branch -a
    * master
      remotes/origin/MyDevBranch
      remotes/origin/tags/MyDevBranch-1.0
      remotes/origin/trunk
    $$ git checkout -b MyDevBranch origin/MyDevBranch
    Branch MyDevBranch set up to track remote branch MyDevBranch from origin.
    Switched to a new branch 'MyDevBranch'
    $ git branch -a
    * MyDevBranch
      master
      remotes/origin/MyDevBranch
      remotes/origin/tags/MyDevBranch-1.0
      remotes/origin/trunk
    $
    
    $git checkout origin/tags/MyDevBranch-1.0
    Note: checking out 'origin/tags/MyDevBranch-1.0'.
    You are in 'detached HEAD' state. You can look around, make experimental
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by performing another checkout.
    
    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -b with the checkout command again. Example:
    
      git checkout -b new_branch_name
    
    HEAD is now at 3041d81... Creating a tag
    $ git branch -a
    * (detached from origin/tags/MyDevBranch-1.0)
      MyDevBranch
      master
      remotes/origin/MyDevBranch
      remotes/origin/tags/MyDevBranch-1.0
      remotes/origin/trunk
    $ git tag -a MyDevBranch-1.0 -m "creating tag"
    $git tag
    MyDevBranch-1.0
    $
    
    $ git push origin master MyDevBranch MyDevBranch-1.0
    Counting objects: 14, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (11/11), done.
    Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
    Total 14 (delta 3), reused 0 (delta 0)
    To https://github.com/pankaj0323/JDProjects.git
     * [new branch]      master -> master
     * [new branch]      MyDevBranch -> MyDevBranch
     * [new tag]         MyDevBranch-1.0 -> MyDevBranch-1.0
    $
    
    $ git remote add origin https://github.com/pankaj0323/JDProjects.git
    $ git branch -a
      MyDevBranch
    * master
      remotes/svn/MyDevBranch
      remotes/svn/trunk
    $ git tag
      MyDevBranch-1.0
    $ git push origin master MyDevBranch MyDevBranch-1.0
    
    @echo off 
    SET FROM=%1 
    SET TO=%2 
    SET TMP=tmp_%random%
    
    echo from:  %FROM% 
    echo to:    %TO% 
    echo tmp:   %TMP%
    
    pause
    
    git svn clone  --no-metadata --authors-file=users.txt %FROM% %TMP%  
    cd %TMP% 
    git remote add origin %TO% 
    git push --set-upstream origin master
    
    
    cd .. 
    echo delete %TMP% ... 
    pause
    
    rmdir /s /q %TMP%
    
    User1 = User One <u.1@xxx.com>
    
    svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt
    
    someuser = someuser <someuser>
    
    someuser = Some User <someuser@somewhere.com>
    
    git svn clone --stdlayout --no-metadata -r854:HEAD --authors-file=authors-transform.txt https://somesvnserver/somerepo/ temp
    
    cd temp
    
    git svn fetch
    
    git 1.0.0 origin/tags/1.0.0
    
    for brname in `git branch -r | grep tags | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do echo $brname; tname=${brname:5}; echo $tname; git tag $tname origin/tags/$tname; done
    
    git checkout -b branchname origin/branches/branchname
    
    for brname in `git branch -r | grep -v master | grep -v HEAD | grep -v trunk | grep -v tags | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do echo $brname; git checkout -b $brname origin/$brname; done
    
    cd ..
    git clone temp temp2
    cd temp2
    
    git checkout -b WORKING
    git branch -m develop
    git push origin --delete WORKING
    git push origin -u develop
    
    git remote set-url origin https://somebitbucketserver/somerepo.git
    git push -u origin --all
    git push origin --tags