如何通过git给添加多个远程库url地址


原文链接: 如何通过git给添加多个远程库url地址

[](https://github.com/brigade/overcommit)

高富帅们的Git技巧 - 新闻 - SegmentFault

git给远程库添加多个url地址

附录: Windows下 ssh-agent自动启动

ssh.config 配置

# 1. eval "$(ssh-agent -s)"
# 2. ssh-add ~/.ssh/pytool/id_rsa
# github  ` git clone pytool.github.com:pytool/repo.git `
# ssh -T git@pytool.github.com
Host pytool.github.com
  HostName github.com
  PreferredAuthentications publickey,password
  IdentityFile ~/.ssh/pytool/id_rsa
  IdentitiesOnly yes

# 3. ssh-add ~/.ssh/rinetd/id_rsa
Host rinetd.github.com
  HostName github.com
  PreferredAuthentications publickey,password
  IdentityFile ~/.ssh/rinetd/id_rsa

场合:你可能想要把你的本地的git库,既push到github上,又push到开源中国的Git@OSC上或者coding net上,怎么解决呢?有人可能会用两个甚至多个远程库,即再添加一个远程库git remote add origin2;这个方法很低效,因为你要git push 两次才能完成push到两个库。
解答原理:git的一个远程库可以对应多个地址。
基本命令:

	git remote add gh-pages git@github.com:rinetd/rinetd.github.io
	git remote set-url --add --push gh-pages git@github.com:rinetd/rinetd.github.io
	git remote set-url --add --push gh-pages git@gitlab.com:rinetd/rinetd.gitlab.io.git

	git remote add origin git@github.com:rinetd/drone-rsync
	git remote set-url --add --push origin git@github.com:rinetd/drone-rsync
	git remote set-url --add --push origin git@pytool.pytool.com:pytool/drone-rsync.git
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[remote "origin"]
	url = git@github.com:rinetd/functools.git
	fetch = +refs/heads/*:refs/remotes/origin/*
	pushurl = git@github.com:rinetd/functools.git
	pushurl = git@pytool.github.com:pytool/functools.git
[branch "master"]
	remote = origin
	merge = refs/heads/master
	rebase = true

在本地仓库创建一个指向远程仓库url的链接别名name,可以任意命名:git remote add name url1 (name可以为origin、both等等自定义的名字)

  1. 增加第1个远程库地址:git remote set-url --add --push origin url1 #remote url1 必须添加 否则无法推送到真正的主库
  2. 再增加第2个远程库地址:git remote set-url --add --push origin url2
  3. 删除url链接别名name:git remote rm name (常见的为origin)
    显示当前所有远程库的详细信息,显示格式为:远程库名字 url连接(类型),命令:git remote -v
    查看config文件,里面可以看到添加的地址,位于当前工程.git/config中,可使用命令:git config -e
    推送时只需要执行命令:git push name master,其中name就是url的链接别名,master是推送的分支,要保证几个推送仓库的分支命名是一样的。

3.6 查看改动的内容
改动的内容如果commit的话,可使用:
git log -n 2 --stat :查看最后两次改动过的文件
git log -n 1 -p :查看最后一次提交更改的细节
使用git diff来查看改动内容,其中HEAD代表commit版本,Index代表staged版本
git diff:比较工作目录(Working tree)和暂存区域快照(index)之间的差异,也就是修改之后还没有暂存起来的变化内容。
git diff --cached:查看已经暂存起来的文件(staged)和上次提交时的快照之间(HEAD)的差异
git diff --staged:显示的是下一次commit时会提交到HEAD的内容
git diff HEAD:查看workspace和local repository的差别
git diff b1 b2 或 git diff b1..b2:将b1和b2分支上的最新提交做diff
git diff test:查看当前目录和test分支的差别
git diff HEAD^ HEAD:比较上次提交commit和上上次提交
git_diff_pic

3.7 分支重命名
步骤如下:

把test1分支重命名为test2:git branch -m test1 test2
删除远程分支test1:git push --delete origin test1
将本地分支test2推到远程:git push origin test2

清理 .git 缩减目录大小

git gc

Git合并branch上的指定文件

git checkout -p develop A.h //不切换 branch,把 develop 上的A.h更新到当前分支
git checkout develop .drone* //去掉-p参数,新增 .drone.yml .drone.yml.sig 文件

允许空提交

git commit --allow-empty -m "Initializing gh-pages branch"

lfs

Apt/deb repos: curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
Yum/rpm repos: curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | sudo bash
sudo apt-get install git-lfs

github Emoji表情包

http://www.webpagefx.com/tools/emoji-cheat-sheet/

关闭git pull 弹出的merge 信息

git reset --hard origin/master

[core]
    mergeoptions = --no-edit

git config --global core.mergeoptions --no-edit

git clone文件太大时怎样处理

clone的时候,可以指定深度,如下,为1即表示只克隆最近一次commit.
git clone --depth 1 git@github.com:/

subtree 在主分支管理子项目

1、初始化子项目Subtree
通过
cd P1项目的路径
git subtree add --prefix=用来放S项目的相对路径 git地址 xxx分支
这样的命令,把S项目(我们姑且叫他S项目)的代码下载到--prefix所指定的目录——我们姑且叫他S目录把,并在P1项目里自动产生一个commit(就是把S目录的内容提交到P1项目里)。
对于P2项目也做同样的操作
2、像往常一样更新代码
大家在P1项目里各种提交commit,其中有些commit会涉及到S目录的更改,正如前面提到的,这是没任何关系的,大家也不会感受到有任何不一样。
3、提交更改到子项目的Git服务器
关键的地方来了:
当维护这个S项目 Subtree 的人希望把最近这段时间对S目录的更改提交到S项目的 Git 服务器上时,他执行一段类似于这样的命令:
cd P1项目的路径
git subtree push --prefix=S项目的路径 git地址 xxx分支
Git 会遍历所有的commit,从中找出针对S目录的更改,然后把这些更改记录提交到S项目的Git服务器上
4、更新子项目新的代码到父项目
OK,现在S项目有大量的新代码了,P2项目也想使用这些新代码,维护P2这个Subtree的人只要执行:
git subtree pull --prefix=S项目的路径 git地址 xxx分支
这样就可以将P2项目里S项目目录里的内容更新为S项目xxx分支的最新代码了。

Git多账号切换

有时候会遇到需要使用多个git账号的情况,手动切换是在过于麻烦。
于是就有了一下的解决方案:
首先,切换到ssh的key目录下:
cd ~/.ssh
然后使用ssh-keygen命令创建一个新的SSH key:
ssh-keygen -t rsa -C "sencond@mail.com" -f id_rsa_second
其中id_rsa_second表示保存的key的名称,可以自定义,命令执行之后会在.ssh目录里出现两个文件其中id_rsa_second.pub表示公钥。后面会用到。
由于默认情况下,每次进行SSH连接时默认发送本地钥匙(默认为~/.ssh/id_rsa)。所以之前生成的id_rsa_second在默认情况下是没有被用到的。
这时就需要在~/.ssh 目录创建config文件,该文件用于配置钥匙对应的服务器信息。具体语法如下:
Host 别名

HostName        主机名
Port            端口
User            用户名
IdentityFile    密钥文件的路径

其中Host别名自己任意给出,能方便记忆就行。给出一个示例配置以供参考:

Default github user(first@mail.com)

Host github.com

 HostName github.com
 User git
 IdentityFile ~/.ssh/id_rsa

second user(second@mail.com)

Host github-second

 HostName github.com
 User git
 IdentityFile ~/.ssh/id_rsa_second

配置完成之后,在连接非默认账号需要修改一下远程库的地址,
如本来的远程库地址为git@github:sencond/test.git
现在就需要改为git@github-second:sencond/test.git。
而且通过 ssh + 别名就能登录远程库
注意:

切换账号的时候要修改相应的配置文件
 git config --global user.name 用户名
 git config --global user.email second@email.com
在远程端添加前面生成的id_rsa_second.pub的公钥到远程库里。
使用对应的ssh key密码。
`