SVN或者GIT远程双向同步
作者:matrix 发布时间:2021-09-03 分类:零零星星
现在我需要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/xxx.git
注意:remote-repository-name 为自定义的分支名
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