SVN或者GIT远程双向同步

作者:matrix 发布时间:2021年9月3日 分类:零零星星

现在我需要svn或者git的提交同步到其他远程仓库(svn或git),也就是同步操作。这里的同步最小单位为单次的提交commit。

配合之前的「使用git-svn管理svn仓库」可以完美解决这个问题,利用git来中转管理我们手上的仓库代码。

场景:

有多个相同代码的SVN仓库,我不想全部迁移到git。然而每次修改一个功能的代码就必须手动复制到其他的远程svn/git仓库上,代码相似但又不能直接替换。。。

之前使用git cherry-pick可以解决这个问题,但是要单独给svn用就会很麻烦。尝试用git svn中转试试!

1. 本地添加远程仓库

如果是svn仓库,先使用git svn clone svn://xxx.com/xxx克隆svn仓库到本地

2. 本地添加远程仓库

  • 添加远程SVN仓库:

没有找到命令行的方式添加远程仓库分支,但是可以修改 .git/config文件达到目的。

项目/.git/config文件中新增svn-remote配置:

[core]
    ...
[svn-remote "svn"]
    ...
[svn-remote "qingsui"]
     url = svn://xxxx/qingsui
     fetch = :refs/remotes/git-svn-qingsui

  • 添加远程git仓库:
    可以直接使用git命令添加:
 $ git remote add remote-repository-name https://git.weixin.qq.com/remote-repository-name.git

3. 拉取远程代码

  • 远程SVN仓库:
$ git svn fetch  qingsui

如果需要pull操作来自动更新合并执行命令git svn rebase

  • 远程git仓库:
$  git fetch remote-repository-name

4.新建对应的本地分支

  • 远程SVN仓库:
$ git checkout -b qingsui  remotes/git-svn-qingsui

$ git branch -a # 查看本地分支情况

  • 远程git仓库:
$  git checkout -b remote-repository-name remotes/remote-repository-name/master

5. 将commit提交合并到新分支

commit_id是需要同步到其他远程分支的commit id。

$ git cherry-pick  {commit_id}

6. 推送修改到远程仓库

  • SVN仓库:
$ git svn dcommit
  • git仓库:
$ git push

完美解决,实际上就是使用git来操作。

同步到远程svn仓库操作脚本

#!/bin/bash
#同步commit到其他远程仓库
#example:  shell.sh  dade,qingsui commitID1,commitID2
# dade,qingsui 为`git branch`本地分支名字
if [ ! $1 -o ! $2 ]; then
    echo -e "usage example:  \n $ shell.sh dade,qingsui commitID1,commitID2"
    exit
fi

repo_arr=(`echo $1 | tr ',' ' '`) 
commit_arr=(`echo $2 | tr ',' ' '`) 

for repo in ${repo_arr[@]};do
    for commit_id in ${commit_arr[@]};do
         git checkout $repo
         git svn rebase #git pull操作
         git cherry-pick $commit_id
         git svn dcommit
         git checkout master
        echo -e "\n"
    done
done


说明:
如果自动合并有冲突会操作会失败,需要手动修改再提交&推送。

如果需要git-svn自动输入密码>> https://www.hhtjim.com/git-svn-save-password-credentials-from-input.html

参考:

https://coderwall.com/p/vfop7g/add-an-svn-remote-to-your-git-repo

https://superuser.com/questions/354819/git-svn-pass-password-on-command-line