git之路

git配置多个远程仓库

需求
想要把项目同步备份到coding中一份,期望每次push代码时可以同步push到coding仓库中

解决方案

  1. 在git仓库根目录执行
    git remote add --mirror=push coding [email protected]:example/example.git,添加一个镜像仓库,用来初始化镜像仓库数据或者pull镜像仓库数据时使用。

    对镜像仓库push数据时相当于执行git push --mirror会强制覆盖仓库中的数据 ,会以镜像的方式把包括所有分支和历史的commit提交到目标仓库

  2. 执行

    1
    2
    git remote set-url origin --push --add [email protected]:example/example.git
    git remote set-url origin --push --add [email protected]:example/example.git

    一定要把两个都设置上:设置origin的pushurl为这两个远程仓库url,当设置了pushurl之后便不会再使用url作为默认的pushurl了,所以一定要把两个都设置上

  3. 第一次设置后先执行git push coding把origin的代码镜像到coding仓库
  4. 使用
    使用时修改文件之后只需要正常的执行git push便会向两个目标仓库都推送一遍。
git config
1
2
3
4
5
6
7
8
9
10
11
[remote "origin"]
url = [email protected]:example/example.git
fetch = +refs/heads/*:refs/remotes/origin/*
pushurl = [email protected]:example/example.git
pushurl = [email protected]:example/example.git
[branch "master"]
remote = origin
merge = refs/heads/master
[remote "coding"]
url = [email protected]:example/example.git
mirror = true

另外
不推荐在镜像仓库修改文件,但是如果真的在镜像仓库修改了文件而需要同步到原始仓库,那么先git pull coding获取镜像仓库的最新代码,然后check out origin master ,然后在merge代码过来。具体可以借鉴Syncing a forkGitHub官网的fork代码同步的操作步骤,

参考
git push如何至两个git仓库 - SegmentFault 思否
准备更换git托管,如何迁移原git仓库 - SegmentFault 思否
git本地仓库关联多个remote,怎么用本地一个分支向不同remote不同分支推送代码? - 知乎


git的本地仓库和服务器仓库/裸库

简单总结就是:
不加--bare参数得到的仓库(无论是init还是clone操作),是一个包含工作空间的仓库,可以修改工作空间内容后提交。
--bare参数得到的是不包含工作空间的裸库,因此无法直接修改工作文件。一般是作为远端中心仓库或者说服务器仓库存在的。工作人员从该裸库clone到本地后进行工作然后提交到仓库。

参考:
服务器上的 Git|git-scm
Git 本地仓库和裸仓库 - TaoBeier - SegmentFault 思否
搭建Git服务器

详解:
通过 git init命令可以创建一个本地仓库
本地仓库具备了git的版本控制,可以进行文件修改和commit仓库,
如果git remote add origin [gitUrl]之后还可以push到远程仓库,

而通过git init --bare则是创建的一个裸库
也可以理解为是服务器仓库,该仓库没有工作空间,也就是用户无法直接在该仓库编辑工作文件,只能通过clone下来后进行文件修改然后commit、push。
所以git init --bare是创建一个git服务器的过程,git clone --bare [projectUrl] newProjectRepo则是克隆一个仓库作为新的服务器仓库/裸库(没有工作空间的仓库)的操作,
测试git clone [projectUrl] newProject这样clone下来的是一个projectUrl的本地工作空间,


git复制仓库

Mirroring a repository Duplicating a repository - Github User Documentation
1.Open Terminal.
2.Create a bare clone of the repository.

1
git clone --bare https://github.com/exampleuser/old-repository.git

3.Mirror-push to the new repository.

1
2
cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git

4.Remove the temporary local repository you created in step 1.

1
2
cd ..
rm -rf old-repository.git