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/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

使用git-svn管理svn仓库

作者:matrix 发布时间:2021 年 8 月 24 日 分类:兼容并蓄

git-svn工具是git对比较老的svn的兼容性支持,可以直接对svn仓库进行管理。git-svn内部其实是使用perl脚本处理svn命令,没有的话要重新安装git。之后就可以任意使用git的功能了,比如stash。

mac环境下直接输入命令git svn --version检查是否可用。

出现问题最好是重新安装svn和git:

$ brew reinstall subversion
$ brew reinstall git

clone项目

$ git svn clone svn://username@svn.hhtjim.com/repos

修改&提交

这里和git仓库操作一致

$ git add .
$ git commit -m "first commmit"

推送到远程仓库

使用git svn dcommit代替git push命令

$ git svn dcommit

查看本地仓库的svn地址信息

$ git svn info

参考:

https://www.jianshu.com/p/6a3afcb59fa9

Git-Svn保存密码凭证免输入

作者:matrix 发布时间:2021 年 8 月 12 日 分类:兼容并蓄

使用git-svn管理svn项目每次操作都要输入密码 😳

之前尝试过 echo password | git svn rebase来自动输入,还有删除~/.subversion/auth目录的方法都还是失败,不能达到免输入密码的效果。

办法

以mac为例,打开应用钥匙串访问,删除掉对应svn项目地址的钥匙串<svn://svn.XXXX:3690>密码。
之后马上使用git svn命令操作,系统会自动保存新的密钥在钥匙串中。

图片5344-Git-Svn保存密码凭证

这样在任何程序操作之前去保存密码就可行。git-svn是读取系统保存的密钥,之所以有问题因为密钥是之前的程序授权的,现在使用git-svn也就无法读取。

这样操作之后我这里其他程序没有影响,如果有问题的话可以自行到svn项目目录执行缓存密码凭证操作。

$ svn update --username 'user' --password 'password'

参考:

https://newbedev.com/does-git-svn-store-svn-passwords