mirror of
https://github.com/ZJDoc/GitGuide.git
synced 2026-07-15 16:50:12 +08:00
docs(git): add advanced and error
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
|
||||
# error: RPC failed; curl 56 GnuTLS recv error (-9)
|
||||
|
||||
## 问题描述
|
||||
|
||||
下载`Github`仓库时出现如下错误
|
||||
|
||||
```
|
||||
remote: Enumerating objects: 150, done.
|
||||
remote: Counting objects: 100% (150/150), done.
|
||||
remote: Compressing objects: 100% (90/90), done.
|
||||
error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.
|
||||
fatal: The remote end hung up unexpectedly
|
||||
fatal: 过早的文件结束符(EOF)
|
||||
fatal: index-pack 失败
|
||||
```
|
||||
|
||||
## 解析
|
||||
|
||||
参考[git error: RPC failed; curl 56 GnuTLS](https://stackoverflow.com/questions/38378914/git-error-rpc-failed-curl-56-gnutls)和[Git 克隆错误‘RPC failed; curl 56 Recv failure....’ 及克隆速度慢问题解决](https://blog.csdn.net/qq_34121797/article/details/79561110),有可能是`http缓存不够`或者`网络不稳定`问题
|
||||
|
||||
* 对于网络不稳定问题
|
||||
|
||||
>Rebuilding git with openssl instead of gnutls fixed my problem.
|
||||
|
||||
* 对于`http`缓存不够
|
||||
|
||||
```
|
||||
# httpBuffer加大
|
||||
$ git config --global http.postBuffer 524288000
|
||||
```
|
||||
|
||||
## 解决
|
||||
|
||||
重新设置了`http`缓存,不过最后是通过码云的方式解决的
|
||||
|
||||
1. 先将`Github`仓库拉取到码云仓库
|
||||
2. 在从码云上下载
|
||||
36
docs/git/advanced/为每个项目单独设置用户名和邮箱.md
Normal file
36
docs/git/advanced/为每个项目单独设置用户名和邮箱.md
Normal file
@@ -0,0 +1,36 @@
|
||||
|
||||
# 为每个项目单独设置用户名和邮箱
|
||||
|
||||
## 问题描述
|
||||
|
||||
提交`git`记录前需要先设置用户名和邮箱,最常用的方式就是全局设置
|
||||
|
||||
```
|
||||
$ git config --global user.name xxx
|
||||
$ git config --global user.email xxx
|
||||
# 查看
|
||||
$ git config -l
|
||||
```
|
||||
|
||||
最近想要在服务器上进行版本管理,不方便全局设置,可以在项目路径下进行本地设置
|
||||
|
||||
## 方式一
|
||||
|
||||
进入项目路径,执行如下命令
|
||||
|
||||
```
|
||||
$ git config --local user.name xxx
|
||||
$ git config --local user.email xxx
|
||||
# 查询
|
||||
$ git config --local -l
|
||||
```
|
||||
|
||||
## 方式二
|
||||
|
||||
直接在`.git/config`配置文件中设置
|
||||
|
||||
```
|
||||
[user]
|
||||
name = xxx
|
||||
email = xxx
|
||||
```
|
||||
60
docs/git/advanced/创建裸仓库.md
Normal file
60
docs/git/advanced/创建裸仓库.md
Normal file
@@ -0,0 +1,60 @@
|
||||
|
||||
# 创建裸仓库
|
||||
|
||||
裸仓库,也就是不包含当前工作目录的仓库,即`.git`文件夹,可作为服务器`git`仓库
|
||||
|
||||
有两种方式,一是使用本地已存在的仓库,二是新建远程裸仓库
|
||||
|
||||
## 本地导出
|
||||
|
||||
从已有仓库中导出`.git`文件夹,有两种方式
|
||||
|
||||
1. 使用`git`命令
|
||||
|
||||
git clone --bare my_project my_project.git
|
||||
|
||||
$ git clone --bare TEST TEST.git
|
||||
Cloning into bare repository 'TEST.git'...
|
||||
done.
|
||||
|
||||
2. 使用`cp`命令
|
||||
|
||||
cp -rf my_project/.git my_project.git
|
||||
|
||||
### 放置在远程服务器
|
||||
|
||||
在服务器上新建文件夹`git`
|
||||
|
||||
$ pwd
|
||||
/home/ubuntu/git
|
||||
|
||||
复制本地裸仓库到服务器
|
||||
|
||||
$ scp -r TEST.git ubuntu@132.232.142.219:/home/ubuntu/git/TEST.git
|
||||
|
||||
这样在`git`文件夹下就有了裸仓库`TEST.git`
|
||||
|
||||
$ pwd
|
||||
/home/ubuntu/git/TEST.git
|
||||
|
||||
## 远程新建
|
||||
|
||||
在远程服务器新建文件夹,并在其中初始化为裸仓库
|
||||
|
||||
$ mkdir TE.git
|
||||
$ cd TE.git
|
||||
$ git init --bare
|
||||
Initialized empty Git repository in /home/ubuntu/git/TE.git/
|
||||
# 如果想要同一组内的其他用户也可访问该仓库,添加参数--shared来修改仓库权限
|
||||
$ git init --bare --shared
|
||||
Initialized empty shared Git repository in /home/ubuntu/git/TE.git/
|
||||
|
||||
## 克隆裸仓库
|
||||
|
||||
和`github`操作方式类似
|
||||
|
||||
git clone ubuntu@132.232.142.219:/home/ubuntu/git/TEST.git
|
||||
|
||||
## 相关阅读
|
||||
|
||||
* [4.2 服务器上的 Git - 在服务器上搭建 Git](https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E5%9C%A8%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E6%90%AD%E5%BB%BA-Git)
|
||||
32
docs/git/advanced/工作目录和裸仓库分离.md
Normal file
32
docs/git/advanced/工作目录和裸仓库分离.md
Normal file
@@ -0,0 +1,32 @@
|
||||
|
||||
# 工作目录和裸仓库分离
|
||||
|
||||
裸仓库指`.git`文件夹,工作目录指除`.git`文件夹外的其他文件
|
||||
|
||||
使用场景之一如下:
|
||||
|
||||
1. 本地将修改好的代码上传到远程裸仓库
|
||||
2. 裸仓库获取到代码后,通过钩子生成工作目录,放置在其他路径下
|
||||
3. 服务器再对工作目录进行操作,比如`nginx`对静态文件进行托管
|
||||
|
||||
在`.git/hooks`文件夹下新建`post-receive`文件
|
||||
|
||||
$ vim post-receive
|
||||
|
||||
添加如下内容
|
||||
|
||||
#!/bin/sh
|
||||
|
||||
git --work-tree=工作目录 --git-dir=裸仓库 checkout -f
|
||||
|
||||
授予执行权限
|
||||
|
||||
$ sudo chmod +x post-receive
|
||||
|
||||
## 相关阅读
|
||||
|
||||
* [GIT_DIR和GIT_WORK_TREE的妙用,工作区和仓储可隔离](http://www.yinqisen.cn/blog-718.html)
|
||||
|
||||
* [通过git自动部署WEB服务上的PHP代码,提交即生效](http://www.yinqisen.cn/blog-675.html)
|
||||
|
||||
* [8.3 自定义 Git - Git 钩子](https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git-%E9%92%A9%E5%AD%90)
|
||||
37
docs/git/advanced/拉取指定远程分支到本地.md
Normal file
37
docs/git/advanced/拉取指定远程分支到本地.md
Normal file
@@ -0,0 +1,37 @@
|
||||
|
||||
# 拉取指定远程分支到本地
|
||||
|
||||
由于`git`去中心化的特性,下载远程仓库时会将所有分支都下载下来,不仅耗时而且占用本地磁盘容量。拉取指定远程分支到本地
|
||||
|
||||
## 思路
|
||||
|
||||
* 首先在本地新建`git`仓库;
|
||||
* 然后下载指定远程分支;
|
||||
* 最后创建本地分支并关联到指定远程分支即可。
|
||||
|
||||
## 实现
|
||||
|
||||
新建仓库
|
||||
|
||||
```
|
||||
$ mkdir gitrepo
|
||||
$ cd giterpo
|
||||
$ git init
|
||||
```
|
||||
|
||||
拉取远程指定分支
|
||||
|
||||
```
|
||||
$ git remote add origin https://github.com/zjZSTU/zjzstu.github.com.git
|
||||
$ git fetch origin dev
|
||||
```
|
||||
|
||||
新建本地分支并关联到指定远程分支
|
||||
|
||||
```
|
||||
$ git checkout -b dev origin/dev
|
||||
```
|
||||
|
||||
## 相关阅读
|
||||
|
||||
* [git 拉取远程分支到本地](https://blog.csdn.net/carfge/article/details/79691360)
|
||||
133
docs/git/advanced/推送到多个远程托管服务器.md
Normal file
133
docs/git/advanced/推送到多个远程托管服务器.md
Normal file
@@ -0,0 +1,133 @@
|
||||
|
||||
# 推送到多个远程托管服务器
|
||||
|
||||
将代码推送到多个远程托管服务器,多重备份保证安全性,比如推送到`github`和`coding`
|
||||
|
||||
有两种情况
|
||||
|
||||
1. 同时推送代码到多个仓库
|
||||
2. 指定推送的地址,比如本次操作仅推送到`github`,不推送到`coding`
|
||||
|
||||
首先查看当前已追踪的远程仓库地址
|
||||
|
||||
$ git remote -v
|
||||
origin https://git.dev.tencent.com/zjZSTU/TEST.git (fetch)
|
||||
origin https://git.dev.tencent.com/zjZSTU/TEST.git (push)
|
||||
|
||||
当前已追踪了`coding`服务器上的仓库,需要加入`github`仓库
|
||||
|
||||
*针对多个远程仓库的推送,使用`SSH`传输协议可以提高操作便捷性*
|
||||
|
||||
## 同时推送
|
||||
|
||||
### 命令行操作
|
||||
|
||||
添加`github`仓库地址
|
||||
|
||||
$ git remote set-url --add --push origin https://github.com/zjZSTU/TEST.git
|
||||
$ git remote -v
|
||||
origin https://git.dev.tencent.com/zjZSTU/TEST.git (fetch)
|
||||
origin https://github.com/zjZSTU/TEST.git (push)
|
||||
|
||||
再重新添加`coding`的仓库地址
|
||||
|
||||
$ git remote set-url --add --push origin https://git.dev.tencent.com/zjZSTU/TEST.git
|
||||
$ git remote -v
|
||||
origin https://git.dev.tencent.com/zjZSTU/TEST.git (fetch)
|
||||
origin https://github.com/zjZSTU/TEST.git (push)
|
||||
origin https://git.dev.tencent.com/zjZSTU/TEST.git (push)
|
||||
|
||||
这样就可以同时推送到多个远程仓库
|
||||
|
||||
$ git push -u origin master
|
||||
Username for 'https://github.com': zjZSTU
|
||||
Password for 'https://zjZSTU@github.com':
|
||||
...
|
||||
...
|
||||
To https://github.com/zjZSTU/TEST.git
|
||||
d19a01e..4b76b5d master -> master
|
||||
Branch master set up to track remote branch master from origin.
|
||||
Username for 'https://git.dev.tencent.com': zjZSTU
|
||||
Password for 'https://zjZSTU@git.dev.tencent.com':
|
||||
...
|
||||
...
|
||||
To https://git.dev.tencent.com/zjZSTU/TEST.git
|
||||
d19a01e..4b76b5d master -> master
|
||||
Branch master set up to track remote branch master from origin.
|
||||
|
||||
### 文件操作
|
||||
|
||||
修改`.git`文件夹下的`CONFIG`文件
|
||||
|
||||
# 原先
|
||||
[remote "origin"]
|
||||
fetch = +refs/heads/*:refs/remotes/origin/*
|
||||
url = https://git.dev.tencent.com/zjZSTU/TEST.git
|
||||
|
||||
# 修改为
|
||||
[remote "origin"]
|
||||
fetch = +refs/heads/*:refs/remotes/origin/*
|
||||
url = https://git.dev.tencent.com/zjZSTU/TEST.git
|
||||
pushurl = https://github.com/zjZSTU/TEST.git
|
||||
pushurl = https://git.dev.tencent.com/zjZSTU/TEST.git
|
||||
|
||||
在`origin`小节中添加属性`pushurl`,设置多个远程仓库地址
|
||||
|
||||
## 指定推送
|
||||
|
||||
指定推送操作和同时推送操作能够同时并存在同一个仓库中
|
||||
|
||||
默认情况下使用`origin`作为远程仓库名,可以添加另外的名字,在旗下指定新的远程仓库
|
||||
|
||||
当前操作如下:默认`origin`指向`coding`,添加`github`指向`github`仓库,添加`all`指向`github`和`coding`
|
||||
|
||||
### 命令行操作
|
||||
|
||||
添加`github`远程
|
||||
|
||||
$ git remote add github https://github.com/zjZSTU/TEST.git
|
||||
$ git remote -v
|
||||
github https://github.com/zjZSTU/TEST.git (fetch)
|
||||
github https://github.com/zjZSTU/TEST.git (push)
|
||||
origin https://git.dev.tencent.com/zjZSTU/TEST.git (fetch)
|
||||
origin https://git.dev.tencent.com/zjZSTU/TEST.git (push)
|
||||
|
||||
添加`all`远程
|
||||
|
||||
$ git remote add all https://github.com/zjZSTU/TEST.git
|
||||
$ git remote set-url --add --push all https://git.dev.tencent.com/zjZSTU/TEST.git
|
||||
$ git remote set-url --add --push all https://github.com/zjZSTU/TEST.git
|
||||
$ git remote -v
|
||||
all https://github.com/zjZSTU/TEST.git (fetch)
|
||||
all https://git.dev.tencent.com/zjZSTU/TEST.git (push)
|
||||
all https://github.com/zjZSTU/TEST.git (push)
|
||||
github https://github.com/zjZSTU/TEST.git (fetch)
|
||||
github https://github.com/zjZSTU/TEST.git (push)
|
||||
origin https://git.dev.tencent.com/zjZSTU/TEST.git (fetch)
|
||||
origin https://git.dev.tencent.com/zjZSTU/TEST.git (push)
|
||||
|
||||
上传代码
|
||||
|
||||
# 上传到coding
|
||||
git push -u origin master
|
||||
# 上传到github
|
||||
git push -u github master
|
||||
# 同时上传
|
||||
git push -u all master
|
||||
|
||||
### 文件操作
|
||||
|
||||
修改`.git`文件夹下的`CONFIG`文件,添加`github`和`all`小节
|
||||
|
||||
[remote "github"]
|
||||
url = https://github.com/zjZSTU/TEST.git
|
||||
fetch = +refs/heads/*:refs/remotes/github/*
|
||||
[remote "all"]
|
||||
url = https://github.com/zjZSTU/TEST.git
|
||||
fetch = +refs/heads/*:refs/remotes/all/*
|
||||
pushurl = https://git.dev.tencent.com/zjZSTU/TEST.git
|
||||
pushurl = https://github.com/zjZSTU/TEST.git
|
||||
|
||||
## 相关阅读
|
||||
|
||||
* [Git - Pushing code to two remotes [duplicate]](https://stackoverflow.com/questions/14290113/git-pushing-code-to-two-remotes)
|
||||
117
docs/git/advanced/本地分支操作.md
Normal file
117
docs/git/advanced/本地分支操作.md
Normal file
@@ -0,0 +1,117 @@
|
||||
|
||||
# 本地分支操作
|
||||
|
||||
主要学习内容:
|
||||
|
||||
1. 分支显示、创建和切换
|
||||
2. 分支暂存
|
||||
3. 分支删除
|
||||
4. 分支合并
|
||||
|
||||
使用命令
|
||||
|
||||
1. [git branch](https://git-scm.com/docs/git-branch)
|
||||
2. [git checkout](https://git-scm.com/docs/git-checkout)
|
||||
3. [git stash](https://git-scm.com/docs/git-stash)
|
||||
4. [git merge](https://git-scm.com/docs/git-merge)
|
||||
|
||||
## 分支显示、创建和切换
|
||||
|
||||
显示所有分支以及当前所处分支
|
||||
|
||||
```
|
||||
$ git branch
|
||||
```
|
||||
|
||||
创建新分支testing
|
||||
|
||||
```
|
||||
$ git branch testing
|
||||
```
|
||||
|
||||
切换到新分支testing
|
||||
|
||||
```
|
||||
$ git checkout testing
|
||||
```
|
||||
|
||||
创建新分支`aa`并自动切换
|
||||
|
||||
```
|
||||
$ git checkout -b aa
|
||||
```
|
||||
|
||||
## 分支暂存
|
||||
|
||||
在切换分支之前最好先保存当前在暂存区域的内容,使用`git stash`命令将其保存在一个*脏*目录中
|
||||
|
||||
暂存当前工作状态
|
||||
|
||||
```
|
||||
$ git stash
|
||||
```
|
||||
|
||||
可进行多次暂存操作,查看暂存列表
|
||||
|
||||
```
|
||||
$ git stash list
|
||||
```
|
||||
|
||||
重新释放最新的暂存内容
|
||||
|
||||
```
|
||||
$ git stash apply
|
||||
```
|
||||
|
||||
指定暂存节点进行释放
|
||||
|
||||
```
|
||||
$ git stash apply 节点名
|
||||
```
|
||||
|
||||
清除所有的暂存节点
|
||||
|
||||
```
|
||||
$ git stash clear
|
||||
```
|
||||
|
||||
## 分支删除
|
||||
|
||||
删除指定分支
|
||||
|
||||
```
|
||||
$ git branch -d 分支名
|
||||
```
|
||||
|
||||
## 分支合并
|
||||
|
||||
合并指定分支到当前分支
|
||||
|
||||
```
|
||||
$ git merge 分支名
|
||||
```
|
||||
|
||||
在分支合并出现冲突时可以使用命令回复到之前为合并状态
|
||||
|
||||
```
|
||||
$ git merge --abort
|
||||
```
|
||||
|
||||
不合并其他分支的提交历史
|
||||
|
||||
```
|
||||
# 仅添加文件,不进行提交
|
||||
$ git merge --squash
|
||||
# 添加文件并进行提交
|
||||
$ git merge --no-squash
|
||||
```
|
||||
|
||||
使用参数`--merged`和`--no-merged`过滤已合并和未合并到当前分支的分支
|
||||
|
||||
## 相关阅读
|
||||
|
||||
* [3.1 Git 分支 - 分支简介](https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%AE%80%E4%BB%8B)
|
||||
|
||||
* [3.2 Git 分支 - 分支的新建与合并](https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6)
|
||||
|
||||
* [7.3 Git 工具 - 储藏与清理](https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%82%A8%E8%97%8F%E4%B8%8E%E6%B8%85%E7%90%86#r_git_stashing)
|
||||
8
docs/git/advanced/绘制分支图.md
Normal file
8
docs/git/advanced/绘制分支图.md
Normal file
@@ -0,0 +1,8 @@
|
||||
|
||||
# 绘制分支图
|
||||
|
||||
## 相关阅读
|
||||
|
||||
* [Pretty git branch graphs](https://stackoverflow.com/questions/1057564/pretty-git-branch-graphs)
|
||||
|
||||
* [Visualizing branch topology in git](https://stackoverflow.com/questions/1838873/visualizing-branch-topology-in-git)
|
||||
208
docs/git/advanced/自建服务器.md
Normal file
208
docs/git/advanced/自建服务器.md
Normal file
@@ -0,0 +1,208 @@
|
||||
|
||||
# 自建服务器
|
||||
|
||||
在云服务器上自建`git`服务器,最简单的方式就是创建裸仓库然后用`ssh`的方式进行代码的拉取和推送,参考[创建裸仓库](./创建裸仓库.md)
|
||||
|
||||
下面实现一个规范的`git`服务器,类似第三方服务器(`github、coding、gitlab`等),其支持`ssh`和`http`协议的仓库操作,但不允许进行远程登录
|
||||
|
||||
第三方仓库名如下:
|
||||
|
||||
* `https://<domain-name>/<user-name>/<repo-name>.git`
|
||||
* `git@<domain-name>:<user-name>/<repo-name>.git`
|
||||
|
||||
操作步骤如下:
|
||||
|
||||
1. 创建用户`git`
|
||||
2. `ssh`设置
|
||||
3. 下载仓库
|
||||
|
||||
## 创建用户`git`
|
||||
|
||||
$ sudo adduser git
|
||||
正在添加用户"git"...
|
||||
正在添加新组"git" (1000)...
|
||||
正在添加新用户"git" (1000) 到组"git"...
|
||||
创建主目录"/home/git"...
|
||||
正在从"/etc/skel"复制文件...
|
||||
输入新的 UNIX 密码:
|
||||
重新输入新的 UNIX 密码:
|
||||
passwd: password updated successfully
|
||||
Changing the user information for git
|
||||
Enter the new value, or press ENTER for the default
|
||||
Full Name []:
|
||||
Room Number []:
|
||||
Work Phone []:
|
||||
Home Phone []:
|
||||
Other []:
|
||||
这些信息是否正确? [Y/n]
|
||||
|
||||
在`/data`目录下创建目录`repositories`,然后在里面创建一个裸仓库
|
||||
|
||||
# 创建目录
|
||||
$ sudo mkdir -p /data/repositories
|
||||
# 设置用户和组
|
||||
$ sudo chown -R git:git /data/repositories
|
||||
# 设置可访问权限
|
||||
$ sudo chmod 755 /data/repositories/
|
||||
# 创建裸仓库
|
||||
$ git init --bare hello.git
|
||||
Initialized empty Git repository in /data/repositories/hello.git/
|
||||
|
||||
## 设置ssh连接
|
||||
|
||||
将客户端的`ssh`公钥添加到用户`git`的`.ssh/authorized_keys`文件中,即可实现`ssh`连接
|
||||
|
||||
$ mkdir .ssh && chmod 700 .ssh
|
||||
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
|
||||
|
||||
### 设置git-shell连接
|
||||
|
||||
设置用户`git`仅能操作`git`相关内容,可以将用户`git`的登录`shell`设置为`git-shell`
|
||||
|
||||
#查看用户git登录shell
|
||||
$ cat /etc/passwd | grep git
|
||||
git:x:1000:1000:,,,:/home/git:/bin/bash
|
||||
|
||||
修改为`git-shell`
|
||||
|
||||
# 查找
|
||||
$ which git-shell
|
||||
/usr/bin/git-shell
|
||||
# 修改
|
||||
$ sudo vim /etc/passwd
|
||||
# 修改后
|
||||
$ cat /etc/passwd | grep git
|
||||
git:x:1000:1000:,,,:/home/git:/usr/bin/git-shell
|
||||
|
||||
## 下载仓库
|
||||
|
||||
下载仓库`hello.git`到本地
|
||||
|
||||
$ git clone git@132.232.142.219:/data/repositories/hello.git
|
||||
Cloning into 'hello'...
|
||||
warning: You appear to have cloned an empty repository.
|
||||
Checking connectivity... done.
|
||||
$ cd hello/
|
||||
$ ls -al
|
||||
total 12
|
||||
drwxrwxr-x 3 zj zj 4096 3月 9 16:29 .
|
||||
drwxr-xr-x 4 zj zj 4096 3月 9 16:29 ..
|
||||
drwxrwxr-x 7 zj zj 4096 3月 9 16:29 .git
|
||||
|
||||
添加文件`hello.txt`,加入版本管理并上传
|
||||
|
||||
$ touch hello.txt
|
||||
$ ls
|
||||
hello.txt
|
||||
$ git add hello.txt
|
||||
$ git commit -m "hello git"
|
||||
[master (root-commit) 24265ed] hello git
|
||||
1 file changed, 0 insertions(+), 0 deletions(-)
|
||||
create mode 100644 hello.txt
|
||||
$ git push -u origin master
|
||||
Counting objects: 3, done.
|
||||
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
|
||||
Total 3 (delta 0), reused 0 (delta 0)
|
||||
To git@132.232.142.219:/data/repositories/hello.git
|
||||
* [new branch] master -> master
|
||||
Branch master set up to track remote branch master from origin.
|
||||
|
||||
### 配置config
|
||||
|
||||
使用`config`文件可以简易仓库下载地址,在本地`~/.ssh`文件夹下新建配置文件`config`,添加如下
|
||||
|
||||
$ cat config
|
||||
host git-server
|
||||
user server
|
||||
hostname 132.232.142.219
|
||||
port 22
|
||||
identityfile ~/.ssh/tencent_id_rsa
|
||||
# 设置访问权限
|
||||
$ sudo chmod 600 config
|
||||
|
||||
**注意:用`tab`键保持文档格式**
|
||||
|
||||
`config`文件指定了主机名`git-server`配置的用户名、`ip`地址、端口号和私钥地址
|
||||
|
||||
添加配置文件后下载仓库地址如下
|
||||
|
||||
$ git clone git-server:/data/repositories/hello.git
|
||||
Cloning into 'hello'...
|
||||
remote: Counting objects: 3, done.
|
||||
Receiving objects: 100% (3/3), done.
|
||||
remote: Total 3 (delta 0), reused 0 (delta 0)
|
||||
Checking connectivity... done.
|
||||
|
||||
## ERROR
|
||||
|
||||
* 问题一:`publickey denied`
|
||||
|
||||
`ssh`连接失败,这个问题很迷,耗了`1`天时间,网上找了很多资料没有结果,有一个博客主也遇到了同样的问题,他最后解决是因为突然就可以了,我也一样
|
||||
|
||||
* 问题二:`git is not in the sudoers file. This incident will be reported.`
|
||||
|
||||
是因为`git`没有添加到`sudo`权限,参考[xxx is not in the sudoers file.This incident will be reported.的解决方法](https://www.cnblogs.com/xiaochaoyxc/p/6206481.html)
|
||||
|
||||
1. 先切换到`ubuntu`用户
|
||||
|
||||
$ su ubuntu
|
||||
|
||||
2. 赋予`sudo`文件写权限
|
||||
|
||||
$ sudo chmod u+w /etc/sudoers
|
||||
|
||||
3. 修改文件`/etc/sudoers`
|
||||
|
||||
$ sudo vim /etc/sudoers
|
||||
# 添加
|
||||
youuser ALL=(ALL) ALL
|
||||
|
||||
表示允许用户`youuser`执行`sudo`命令(需要输入密码)
|
||||
|
||||
4. 撤销`sudo`文件写权限
|
||||
|
||||
$ sudo chmod u-w /etc/sudoers
|
||||
|
||||
5. 重新切换回原来用户
|
||||
|
||||
$ su git
|
||||
|
||||
* 问题三:`perl: warning: Falling back to a fallback locale ("en_US.utf8").`
|
||||
|
||||
```
|
||||
$ sudo adduser zhujian
|
||||
perl: warning: Setting locale failed.
|
||||
perl: warning: Please check that your locale settings:
|
||||
LANGUAGE = (unset),
|
||||
LC_ALL = (unset),
|
||||
LC_MEASUREMENT = "zh_CN.UTF-8",
|
||||
LC_PAPER = "zh_CN.UTF-8",
|
||||
LC_MONETARY = "zh_CN.UTF-8",
|
||||
LC_NAME = "zh_CN.UTF-8",
|
||||
LC_ADDRESS = "zh_CN.UTF-8",
|
||||
LC_NUMERIC = "zh_CN.UTF-8",
|
||||
LC_TELEPHONE = "zh_CN.UTF-8",
|
||||
LC_IDENTIFICATION = "zh_CN.UTF-8",
|
||||
LC_TIME = "zh_CN.UTF-8",
|
||||
LANG = "en_US.utf8"
|
||||
are supported and installed on your system.
|
||||
perl: warning: Falling back to a fallback locale ("en_US.utf8").
|
||||
Adding user `zhujian'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+VVpw5kOZBmzJYz/vngYpAAV61Fq9oChSflQFkfzr1sKHRqq2/sqeZD3gzPQZbrKWcHbuGCWyQOvm1gH+67gW+TpUO9DWeeHqo3h5rlCW+ElJcL/q4b+ZBVEmGDjzE+Sg+6wM+izBl5xzHDFeLhN3Yw1OVc2rwQFQ/CD6FSKdL4b5bt0/5rpu65sv7haXjfDMSEsIVgPY5behLzZzoXy81iN4/tPF3cjDsn/x5Yywc60LdslJ5hW5wlozhq1LibUXk9JQu/+5DDZKi8ytMEoe1S7yROvaC/ofJQR22hINnFoLNBC8gSFM2YR+t9oBF0eiAaVwfgddA0+ScYrWA5Yr zj@zj-ThinkPad-T470p ...
|
||||
Adding new group `zhujian' (1000) ...
|
||||
Adding new user `zhujian' (1000) with group `zhujian' ...
|
||||
Creating home directory `/home/zhujian' ...
|
||||
...
|
||||
...
|
||||
```
|
||||
|
||||
提示语言包问题,参考[perl: warning: Falling back to a fallback locale ("en_US.UTF-8")](https://blog.csdn.net/jmpjmpkiss/article/details/55098794)
|
||||
|
||||
$ sudo apt install locales-all
|
||||
|
||||
## 相关阅读
|
||||
|
||||
* [搭建 Git 服务器](https://cloud.tencent.com/developer/labs/lab/10045)
|
||||
|
||||
* [4.4 服务器上的 Git - 配置服务器](https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E9%85%8D%E7%BD%AE%E6%9C%8D%E5%8A%A1%E5%99%A8)
|
||||
|
||||
* [干货 | 简单几步搭建一个远程git服务器](https://www.onelib.biz/blog/a/581047797628141c0fbfb0ed)
|
||||
103
docs/git/advanced/远程分支操作.md
Normal file
103
docs/git/advanced/远程分支操作.md
Normal file
@@ -0,0 +1,103 @@
|
||||
|
||||
# 远程分支操作
|
||||
|
||||
学习本地分支与远程分支的交互
|
||||
|
||||
1. 分支显示
|
||||
2. 分支同步
|
||||
3. 分支推送
|
||||
4. 分支跟踪
|
||||
5. 分支删除
|
||||
|
||||
使用命令
|
||||
|
||||
1. [git branch](https://git-scm.com/docs/git-branch)
|
||||
2. [git fetch](https://git-scm.com/docs/git-fetch)
|
||||
3. [git push](https://git-scm.com/docs/git-push)
|
||||
4. [git checkout](https://git-scm.com/docs/git-checkout)
|
||||
5. [git merge](https://git-scm.com/docs/git-merge)
|
||||
|
||||
## 分支显示
|
||||
|
||||
显示本地分支和远程分支的关系
|
||||
|
||||
```
|
||||
# 使用参数-vv列出本地分支是否有跟踪远程分支,并且本地分支是否领先或者落后远程分支
|
||||
$ git branch -vv
|
||||
```
|
||||
|
||||
## 分支同步
|
||||
|
||||
获取远程分支数据
|
||||
|
||||
```
|
||||
$ git fetch 远程仓库 # origin是默认的远程仓库
|
||||
```
|
||||
|
||||
使用`git fetch`不会合并远程分支,需要再显式使用`git merge`命令
|
||||
|
||||
使用`git pull`可实现拉取远程分支数据并合并
|
||||
|
||||
```
|
||||
$ git pull 远程仓库 本地分支名
|
||||
```
|
||||
|
||||
## 分支推送
|
||||
|
||||
推送本地分支内容到远程分支
|
||||
|
||||
```
|
||||
$ git push 远程仓库 本地分支名/远程分支名
|
||||
```
|
||||
|
||||
如果需要本地分支和远程分支名一致,实现如下:
|
||||
|
||||
```
|
||||
$ git push 远程仓库 本地分支名
|
||||
```
|
||||
|
||||
使用参数`-u`设置要推送的远程分支为本地待跟踪,方便后续拉取代码操作
|
||||
|
||||
```
|
||||
$ git push -u 远程仓库 本地分支
|
||||
```
|
||||
|
||||
## 分支跟踪
|
||||
|
||||
设置本地分支想要跟踪的远程分支
|
||||
|
||||
```
|
||||
$ git checkout -b [branch] [remotename]/[branch]
|
||||
```
|
||||
|
||||
如果远程分支和本地分支一致,那么使用简易方式
|
||||
|
||||
```
|
||||
$ git checkout --track [remotename]/[branch]
|
||||
```
|
||||
|
||||
修改要跟踪的远程分支,使用参数`-u`或`--set-upstream-to`
|
||||
|
||||
```
|
||||
$ git branch -u [branch] [remotename]/[branch]
|
||||
# 同样的分支名
|
||||
$ git branch -u [remotename]/[branch]
|
||||
```
|
||||
|
||||
## 分支删除
|
||||
|
||||
删除远程分支
|
||||
|
||||
```
|
||||
$ git push 远程仓库 --delete 远程分支名
|
||||
```
|
||||
|
||||
如果远程分支已在本地分支之后,可以不删除远程分支而使用强制方式推送到远程分支,参考[[Git高级教程(二)] 远程仓库版本回退方法](https://blog.csdn.net/fuchaosz/article/details/52170105)
|
||||
|
||||
```
|
||||
$ git push -f
|
||||
```
|
||||
|
||||
## 相关阅读
|
||||
|
||||
* [3.5 Git 分支 - 远程分支](https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E8%BF%9C%E7%A8%8B%E5%88%86%E6%94%AF)
|
||||
43
docs/git/advanced/远程分支替换本地分支.md
Normal file
43
docs/git/advanced/远程分支替换本地分支.md
Normal file
@@ -0,0 +1,43 @@
|
||||
|
||||
# 远程分支替换本地分支
|
||||
|
||||
## 问题描述
|
||||
|
||||
本地分支有`master`,想要使用远程仓库的`master`分支,如何替换?
|
||||
|
||||
## 问题解决
|
||||
|
||||
有两种解决方案
|
||||
|
||||
### 方案一
|
||||
|
||||
拉取远程分支后覆盖本地分支。首先拉取远程分支到本地
|
||||
|
||||
```
|
||||
# 删除已有远程仓库
|
||||
$ git remote remove origin
|
||||
# 设置远程仓库链接
|
||||
$ git remote add origin git@xxx.com:xx.git
|
||||
$ 拉取远程分支
|
||||
$ git fetch origin master
|
||||
```
|
||||
|
||||
然后使用远程分支重置本地分支
|
||||
|
||||
```
|
||||
$ git reset --hard origin/master
|
||||
```
|
||||
|
||||
### 方案二
|
||||
|
||||
```
|
||||
删除您的本地分支: git branch -d master
|
||||
获取最新的远程分支: git fetch origin master
|
||||
重建基于远程的本地分支: git checkout -b master origin/master
|
||||
```
|
||||
|
||||
## 相关阅读
|
||||
|
||||
* [拉取指定远程分支到本地](./拉取指定远程分支到本地.md)
|
||||
|
||||
* [如何完全替换本地分支与远程分支?](https://cloud.tencent.com/developer/ask/26508)
|
||||
136
docs/git/error.md
Normal file
136
docs/git/error.md
Normal file
@@ -0,0 +1,136 @@
|
||||
# ERROR
|
||||
|
||||
## 问题一:publickey denied
|
||||
|
||||
`ssh`连接失败,这个问题很迷,耗了`1`天时间,网上找了很多资料没有结果,有一个博客主也遇到了同样的问题,他最后解决是因为突然就可以了,我也一样
|
||||
|
||||
## 问题二:git is not in the sudoers file. This incident will be reported.
|
||||
|
||||
是因为`git`没有添加到`sudo`权限,参考[xxx is not in the sudoers file.This incident will be reported.的解决方法](https://www.cnblogs.com/xiaochaoyxc/p/6206481.html)
|
||||
|
||||
1. 先切换到`ubuntu`用户
|
||||
|
||||
$ su ubuntu
|
||||
|
||||
2. 赋予`sudo`文件写权限
|
||||
|
||||
$ sudo chmod u+w /etc/sudoers
|
||||
|
||||
3. 修改文件`/etc/sudoers`
|
||||
|
||||
$ sudo vim /etc/sudoers
|
||||
# 添加
|
||||
youuser ALL=(ALL) ALL
|
||||
|
||||
表示允许用户`youuser`执行`sudo`命令(需要输入密码)
|
||||
|
||||
4. 撤销`sudo`文件写权限
|
||||
|
||||
$ sudo chmod u-w /etc/sudoers
|
||||
|
||||
5. 重新切换回原来用户
|
||||
|
||||
$ su git
|
||||
|
||||
## 问题三:perl: warning: Falling back to a fallback locale ("en_US.utf8").
|
||||
|
||||
```
|
||||
$ sudo adduser zhujian
|
||||
perl: warning: Setting locale failed.
|
||||
perl: warning: Please check that your locale settings:
|
||||
LANGUAGE = (unset),
|
||||
LC_ALL = (unset),
|
||||
LC_MEASUREMENT = "zh_CN.UTF-8",
|
||||
LC_PAPER = "zh_CN.UTF-8",
|
||||
LC_MONETARY = "zh_CN.UTF-8",
|
||||
LC_NAME = "zh_CN.UTF-8",
|
||||
LC_ADDRESS = "zh_CN.UTF-8",
|
||||
LC_NUMERIC = "zh_CN.UTF-8",
|
||||
LC_TELEPHONE = "zh_CN.UTF-8",
|
||||
LC_IDENTIFICATION = "zh_CN.UTF-8",
|
||||
LC_TIME = "zh_CN.UTF-8",
|
||||
LANG = "en_US.utf8"
|
||||
are supported and installed on your system.
|
||||
perl: warning: Falling back to a fallback locale ("en_US.utf8").
|
||||
Adding user `zhujian'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+VVpw5kOZBmzJYz/vngYpAAV61Fq9oChSflQFkfzr1sKHRqq2/sqeZD3gzPQZbrKWcHbuGCWyQOvm1gH+67gW+TpUO9DWeeHqo3h5rlCW+ElJcL/q4b+ZBVEmGDjzE+Sg+6wM+izBl5xzHDFeLhN3Yw1OVc2rwQFQ/CD6FSKdL4b5bt0/5rpu65sv7haXjfDMSEsIVgPY5behLzZzoXy81iN4/tPF3cjDsn/x5Yywc60LdslJ5hW5wlozhq1LibUXk9JQu/+5DDZKi8ytMEoe1S7yROvaC/ofJQR22hINnFoLNBC8gSFM2YR+t9oBF0eiAaVwfgddA0+ScYrWA5Yr zj@zj-ThinkPad-T470p ...
|
||||
Adding new group `zhujian' (1000) ...
|
||||
Adding new user `zhujian' (1000) with group `zhujian' ...
|
||||
Creating home directory `/home/zhujian' ...
|
||||
...
|
||||
...
|
||||
```
|
||||
|
||||
提示语言包问题,参考[perl: warning: Falling back to a fallback locale ("en_US.UTF-8")](https://blog.csdn.net/jmpjmpkiss/article/details/55098794)
|
||||
|
||||
$ sudo apt install locales-all
|
||||
|
||||
## 问题四:`remote: error: cannot lock ref 'refs/heads/master': ref refs/heads/master`
|
||||
|
||||
在`Travis CI`上上传文件到远程仓库,出现如下问题
|
||||
|
||||
remote: error: cannot lock ref 'refs/heads/master': ref refs/heads/master
|
||||
|
||||
### 起因
|
||||
|
||||
我在上传提交时中间中断了
|
||||
|
||||
$ git push -u origin dev
|
||||
Counting objects: 6, done.
|
||||
Delta compression using up to 8 threads.
|
||||
Compressing objects: 100% (6/6), done.
|
||||
Writing objects: 100% (6/6), 556 bytes | 0 bytes/s, done.
|
||||
Total 6 (delta 5), reused 0 (delta 0)
|
||||
remote: Resolving deltas: 100% (5/5), completed with 5 local objects.
|
||||
^C
|
||||
|
||||
然后再更新文章后再一次提交,就出现了远程仓库锁定的问题
|
||||
|
||||
### 解决
|
||||
|
||||
参考:[git: error: cannot lock ref, error: cannot lock ref](https://blog.csdn.net/sinat_36246371/article/details/79959598)
|
||||
|
||||
将远程仓库下载到本地,然后执行如下命令
|
||||
|
||||
git remote prune origin
|
||||
|
||||
其作用是同步本地远程分支,删除本地已过时的远程分支
|
||||
|
||||
重新触发`CI`工具执行,此时能够成功更新了
|
||||
|
||||
## 问题五:error: RPC failed; curl 56 GnuTLS recv error (-9)
|
||||
|
||||
### 问题描述
|
||||
|
||||
下载`Github`仓库时出现如下错误
|
||||
|
||||
```
|
||||
remote: Enumerating objects: 150, done.
|
||||
remote: Counting objects: 100% (150/150), done.
|
||||
remote: Compressing objects: 100% (90/90), done.
|
||||
error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.
|
||||
fatal: The remote end hung up unexpectedly
|
||||
fatal: 过早的文件结束符(EOF)
|
||||
fatal: index-pack 失败
|
||||
```
|
||||
|
||||
### 解析
|
||||
|
||||
参考[git error: RPC failed; curl 56 GnuTLS](https://stackoverflow.com/questions/38378914/git-error-rpc-failed-curl-56-gnutls)和[Git 克隆错误‘RPC failed; curl 56 Recv failure....’ 及克隆速度慢问题解决](https://blog.csdn.net/qq_34121797/article/details/79561110),有可能是`http缓存不够`或者`网络不稳定`问题
|
||||
|
||||
* 对于网络不稳定问题
|
||||
|
||||
>Rebuilding git with openssl instead of gnutls fixed my problem.
|
||||
|
||||
* 对于`http`缓存不够
|
||||
|
||||
```
|
||||
# httpBuffer加大
|
||||
$ git config --global http.postBuffer 524288000
|
||||
```
|
||||
|
||||
### 解决
|
||||
|
||||
重新设置了`http`缓存,不过最后是通过码云的方式解决的
|
||||
|
||||
1. 先将`Github`仓库拉取到码云仓库
|
||||
2. 在从码云上下载
|
||||
Reference in New Issue
Block a user