本文是另外一篇博文 Win10 Ubuntu子系统设置Git服务器和SSH Server 证书登录,实现win10和macOS源码同步 的一部分,单独拿出来说一下:
首先,设置好远程Git Server的ssh证书登录,假设用户名是git,远程服务器Host设置为nas (具体设置参考上述博文);
其次,设置好 ssh-agent 自启动,具体参考 Win10 cmd命令行,Powershell,Linux子系统Ubuntu bash自动启动ssh-agent
1.1 首先在远程服务器上初始化一个bare仓库,
$ sudo git init --bare smartlight.git
1.2 输入密码就可以看到初始化信息了
[sudo] password for git:
Initialized empty Git repository in /mnt/f/gitRepo/smartlight.git/
1.3 本地仓库添加remote路径
git remote add origin ssh://git@nas/mnt/f/gitRepo/smartlight.git
推送方法1:git push --all origin
$ git push --all origin -u
即可以看到类似下面的信息
Counting objects: 232, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (214/214), done.
Writing objects: 100% (232/232), 8.08 MiB | 2.08 MiB/s, done.
Total 232 (delta 37), reused 0 (delta 0)
remote: Resolving deltas: 100% (37/37), done.
To ssh://nas/mnt/f/gitRepo/Smartlight.git
* [new branch] master -> master
将来再次push简单使用 git push 即可。
git push
推送方法2:git push --mirror
$ git push --mirror
注意,简单使用git clone 理论上已经获取远程的所有分支,但是如果你此时输入 git branch -a ,只能看到本地的master分支和remote的所有分支,如果你要在本地显示每个分支,需要分别checkout到相应的同名分支上。很遗憾git没有提供一个内置的功能让你一次性做这个事情,所以需要创建一个脚本。(以本人的macOS的zsh shell为例)。虽然 git clone 有一个 --mirror 参数,但是这个参数会让你完全复制 git server 的整个目录结构,它并不是你原先的工作目录结构。
2.1 首先,在shell profile (~/.zshrc)里面建立一个函数gclone(),方便将来使用,使用函数是因为通常bash里的alias不支持传递参数:
function gclone(){
git clone ssh://git@nas/mnt/f/gitRepo/$1.git
}
2.2 其次,source 使其生效。
>source ~/.zshrc
2.3 然后,在~/目录创建一个脚本gpa.sh (gpa是git pull all的缩写),内容是
#!/bin/zsh
git checkout master ;
remote=origin ;
for brname in ` git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}' `;
do
git branch -D $brname ;
git checkout -b $brname $remote/$brname ;
done ;
git checkout master
2.4 给gpa.sh添加执行权限:
>chmod +x ~/gpa.sh
2.5 现在开始克隆远程仓库,输入 gclone smartlight ,
这个函数命令相当于 git clone ssh://git@nas/mnt/f/gitRepo/smartlight.git
>gclone smartlight
Cloning into 'smartlight'...
remote: Counting objects: 232, done.
remote: Compressing objects: 100% (177/177), done.
remote: Total 232 (delta 37), reused 232 (delta 37)
Receiving objects: 100% (232/232), 8.08 MiB | 4.90 MiB/s, done.
Resolving deltas: 100% (37/37), done.
2.6 然后切换到这个目录
>cd smartlight
2.7 运行gpa.sh即可
>gpa.sh
(windows需要在git bash中运行)
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull -all
补充:git fetch -all 似乎可以一次性获取远程分支?
参考文献:
1. ZSH alias with parameter
2. How to clone all remote branches in Git?
3. How to fetch all Git branches