学习了廖雪峰老师的Git教程之后的命令总结,重点更新第十项关于git和远程仓库的东西。
如果没有学过,这是传送门
2020.05.29更新:第六章第13节--删除commit信息
2020.05.28更新:第十五章--添加git常见错误及解决办法
2019.07.15更新:第六章第12节--修改commit信息
2019.07.13更新:第六章第11节--创建本地新分支并将新分支和远程某个分支相关联
2019.06.05更新:第十章第9节--添加fork别人的仓库后如何同原仓库保持同步更新
2019.05.25更新:第五章删除文件添加删除远端文件
2019.05.23更新:对一些命令添加了说明信息,添加了origin,对第四部分暂存区git stash命令内容进行更新,添加git checkout的说明,第六部分的合并远程分支添加具体命令,第八部分的第2节创建bug分支处添加具体命令,建议再全看一遍,修改的地方有点多
下面这个图很重要
大家可以将https://github.com/JasonDu1993/gitskillfork到自己的github账号里面然后克隆下来进行尝试
echo "想输入到文件的内容,一般为# 库名字" >> README.md
git init
如果没有配置需要配置
git config --list
git config --global user.email "[email protected]"
git config --global user.name "xy"
git config --list
还可以配置git显示颜色
git config --global color.ui true
配置别名
git config --global alias.st status 使用git st 代替 git status
git config --global alias.co checkout 使用git co 代替 git checkout
git config --global alias.ci commit 使用git ci 代替 git commit
git config --global alias.br branch 使用git br 代替 git branch
有人丧心病狂地把lg配置成了:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git status 查看当前仓库的状态
git diff file_name
git add file2.txt file3.txt 想添加所有的文件git add .
git status
git commit -m "提交记录文字“
git status
举例:
git commit -m "Fixes bug"
如果发现commit信息写错了,
git commit --amend -m "Fixes bug #42"
git log(查看当前状态下的commit信息,不能查看以后的信息)
git reflog(查看所有的命令信息)
git reflog
git log -p --graph
https://www.jianshu.com/p/98c473fb0ee2
通过 git pull更新后,会显示别人修改了哪些文件。此时你想要查看某个文件的具体修改的内容,可通过下面的命令去查看:
git log -p + 文件名 (可查看该文件以前每一次push的修改内容)
git log - p -1 + 文件名 (只查看该文件当前这一次的push内容)
git log --graph 看到分支合并图
git log --graph --pretty=oneline --abbrev-commit
git reset --hard commit_id。除了--hard参数外,还有--soft,--mixed。
下面详细介绍这三个参数:
add表示add操作之后的结果
commit表示commit之后的结果
push:表示进行push操作之后的结果
(stash)表示在add前可能存在stash操作(即暂存工作区的操作)
假设某次提交过程如下
init--(stash1)--add1--commit1--push1--(stash2)--add2--commit2--push2--(stash3)--add3--commit3--push3
举例
--hard 回退到某个版本commit之前的状态 ,进行1,2,3操作。如现在在commit2,或者add2,可以回到commit3或者commit1
--soft 回退到某次commit前的stage状态(即处于暂存状态),进行1操作。如现在在commit2,可以回到add1,或者add3
--mixed回退到add前的状态(即处于工作区,如果有stash,需通过stash pop之后才能真的回到暂存的状态),执行1,2操作。如现在在commit2,可以回退到init--(stash1),或者commit1-push1--(stash2),或者
HEAD指向的版本就是当前版本,HEAD^,前一个版本,HEAD^^前两个,HEAD~100,前100个版本
git fetch --all 可以把远程的commit信息拉到本地更新到本部版本库的master HEAD指针上,然后利用git log和git reflog进行查看操作
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本,也可以用git reflog。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
建议都用git reflog
git stash 暂存工作现场
git stash list 会出现stash@{0}: WIP on dev: 6224937 add mergegit
git stash pop 将暂存区的环境恢复到工作区
git stash list 此时暂存区已经没有数据了
git diff HEAD -- readme.txt 查看工作区和版本库里面最新版本的区别
git checkout -- readme.txt 把工作区的修改全部撤销,其中--不能省,否则就变成切换分支了。
git reset HEAD file_name 可以把暂存区的修改撤销掉(unstage),重新放回工作区
关于git checkout可以看一下这篇文章https://www.cnblogs.com/kuyuecs/p/7111749.html
checkout命令用法如下:
1. git checkout [-q] [
2. git checkout [
3. git checkout [-m] [ [-b | -- orphan ]
用法2比用法1的区别在于,用法1包含了路径。为了避免路径和引用(或提交ID)同名而发生冲突,可以在
git rm file_name
git commit -m "删除信息“
git checkout -- test.txt 用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git rm -r --cached --force .idea/ 删除文件不需要加-r,删除文件夹需要-r, 该文件夹路径为本地文件夹所在路径
git commit -m "delete .idea/" 提交记录
git push origin master 推到远端
git branch
查看远程和本地分支
git branch -a
如果没有成功,先git fetch origin,然后我们在git branch -a
git branch dev 创建分支
git checkout dev 切换分支(不要随意切分支,如果你在某个分支上面修改了一些东西,但没有stash,那么你切换分支后修改的东西就没有任何保存了,如果想切,请先git stash,然后git checkout dev)
stash后没有stash pop,然后reset --hard
git checkout -b dev 创建并切换分支也可以用于切换已有分支
如果想把本地的test分支提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支。
git push origin test:master // 提交本地test分支作为远程的master分支
git push origin test:test // 提交本地test分支作为远程的test分支
也可以在github网站直接创建
直接在红色框位置输入想要创建的分支的名字,然后enter即可。
git merge dev 合并当前分支,一般先切换到需要被合并的分支,如切换到master,该命令在master分支上输入会将dev分支合并到master分支
git merge --no-ff -m "merge with no-ff" dev --no-ff参数,表示禁用Fast forward,用普通模式合并,合并后的历史有分支,能看出来曾经做过合并。
merge和rebase的区别https://blog.csdn.net/wh_19910525/article/details/7554489
git merge b # 将b分支合并到当前分支
git rebase b,也是把 b分支合并到当前分支
假设目前分支:
https://blog.csdn.net/tyyking/article/details/82909099
git的服务器端(remote)端包含多个repository,每个repository可以理解为一个项目。而每个repository下有多个branch。"origin"就是指向某一个repository的指针。服务器端的"master"(强调服务器端是因为本地端也有master)就是指向某个repository的一个branch的指针。
这是服务器端(remote)的情况:
git remote add origin [email protected]:JasonDu1993/learngit.git 关联远程库,相当于让origin等于后面这个地址
https://www.cnblogs.com/chenlogin/p/6592228.html
理解 fetch 的关键, 是理解 FETCH_HEAD,FETCH_HEAD指的是: 某个branch在服务器上的最新状态
当前分支指向的FETCH_HEAD, 就是这个文件第一行对应的那个分支.
一般来说, 存在两种情况:
1)如果没有显式的指定远程分支, 则远程分支的master将作为默认的FETCH_HEAD.
2)如果指定了远程分支, 就将这个远程分支作为FETCH_HEAD.
命令1:git fetch origin branch1
设定当前分支的 FETCH_HEAD' 为远程服务器的branch1分支`。这个操作是git pull origin branch1的第一步, 而对应的pull操作,并不会在本地创建新的branch。
同时这个命令还可以用来测试远程主机的远程分支branch1是否存在, 如果存在, 返回0, 如果不存在, 返回128, 抛出一个异常.
命令2:git fetch origin branch1:branch2
使用远程branch1分支在本地创建branch2(但不会切换到该分支),如果本地不存在branch2分支, 则会自动创建一个新的branch2分支,
如果本地存在branch2分支, 并且是`fast forward', 则自动合并两个分支, 否则, 会阻止以上操作.
//方法一
git fetch origin master //从远程的origin仓库的master分支下载代码到本地的master分支
git log -p master origin/master //比较本地的仓库和远程仓库的区别
git merge origin/master //把远程下载下来的代码合并到本地仓库,远程的和本地的合并
//方法二
git fetch origin master:temp //从远程的origin仓库的master分支下载到本地并新建一个分支temp
git diff temp //比较本地master分支和本地temp分支的不同
git merge temp //合并本地temp分支到本地master分支
git branch -d temp //删除本地temp分支
假设这两个分支是a和b,那么fetch a和b,checkout a,将b merge(rebase)到a,push a到远端。这样做,将b和a合到了一起,并且更新了本地和远端的a。如果b不需要了,可以删除远程b和本地b
git fetch origin a:a 将远程a分支拉到本地a(冒号后面的a表示本地分支a)
git fetch origin b:b 将远程b分支拉到本地b(冒号后面的b表示本地分支b)
git checkout a 切到本地a分支
git merge b 将本地b分支合并到本地a分支上
git push origin a 将本地a分支推到远程a分支
git branch -d b 删除本地分支
git push origin --delete b 删除远程b分支
git branch -d dev 删除分支
git push origin --delete dev
git branch -a 查看本地和远程所有分支
git checkout -b dev /origin/dev 创建本地分支dev并和远程dev分支相关联同时切换到本地dev分支
A,未执行git push 之前可以使用如下的命令进行操作(只能撤销最近一次的commit)
git reset --soft commit_id (commit_id可以git reflog查看)
git commit -m "fix commit" 重新提交信息
B,如果要修改前面多出提交的历史信息,可以采用(2)里面的方法,只是不需要执行git push
命令总结:
git checkout -b dev
git rebase -i HEAD~5
把需要修改的commit信息前的pick改成edit
git commit --amend
git rebase --continue
多次重复执行前面两个命令直到更新
命令总结:
git checkout -b dev (切换到dev分支)
git rebase -i HEAD~5 (对最近5个提交记录进行rebase操作)
把需要修改的commit信息前的pick改成edit (linux下一般通过vim进行操作,即输入i进入编辑模式,修改对应内容,然后esc,接着输入:wq保存退出)
git commit --amend (输入i进入修改模式,修改commit信息,修改完后使用esc退出修改模式,接着输入:wq保存修改)
git rebase --continue
多次重复执行前面两个命令直到更新
git push origin dev -f
下面是详细介绍
https://blog.csdn.net/qq_39956074/article/details/83992286 git 如何修改已经push 的commit 的信息
A,git rebase -i HEAD~5 最新提交的版本为倒数第一个版本,5表示倒数第5个版本,这个数字可以修改,如改成2
前5行即为HEAD~5所提交的信息,第一行为倒数第五个版本的commit信息,第五行为倒数第一个版本commit信息,每行开头未pick,然后未commit id, 然后时commit信息
B,输入i进入修改模式,将需要修改的commit信息前的pick改成edit,修改完后使用esc退出修改模式,接着输入:wq保存修改。
C,命令行输入git commit --amend,输入i进入修改模式,修改commit信息,修改完后使用esc退出修改模式,接着输入:wq保存修改。
【注】保存之后 git rebase --continue还没有使用之前还可以使用git commit --amend继续修改这条commit信息,但如果提交了就只能从头再来了,即使用git rebase -i HEAD~5 把pick改成edit保存退出,然后git commit --amend,保存修改信息之后屏幕输出以下内容
保存修改后命令行会输出以下内容
[detached HEAD fbe9591] 20190716c, bs 16, lr 0.001, maxiter 60000, steps "(50000, 55000)", 8000
Date: Mon Jul 15 18:11:43 2019 +0800
1 file changed, 3 insertions(+), 3 deletions(-)
D,命令行输入git rebase --continue
(py3) jason@jason:~/workspace/mask-detection$ git rebase --continue
Stopped at 896acbdf7545b0e42ff761376a2cdbca899b445d... 20190715c, bs 8, lr 0.0025, maxiter 60000, steps "(50000, 55000)", 8000
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
输出这些信息是因为我们把多个pick改成了edit,因此继续修改commit信息直到全部修改完成,如下所示
(py3) jason@jason:~/workspace/mask-detection$ git commit --amend
[detached HEAD 70929e1] 20190715e, bs 8, lr 0.0025, maxiter 60000, steps "(50000, 55000)", 8000
Date: Mon Jul 15 18:19:56 2019 +0800
1 file changed, 4 insertions(+), 4 deletions(-)
(py3) jason@jason:~/workspace/mask-detection$ git rebase --continue
Successfully rebased and updated refs/heads/jason.
E,git push origin dev -f 将本地更新推送到远程分支上,必须加上-f,否则我们edit的commit会添加到commit后面
(py3) jason@jason:~/workspace/mask-detection$ git push origin dev -f
Password for 'http://[email protected]': 输入密码
Counting objects: 40, done.
Delta compression using up to 12 threads.
Compressing objects: 100% (40/40), done.
Writing objects: 100% (40/40), 7.75 KiB | 0 bytes/s, done.
Total 40 (delta 31), reused 0 (delta 0)
remote:
remote: Create pull request for jason:
remote: http://git.sankuai.com/users/lvtingxun/repos/mask-detection/compare/commits?sourceBranch=refs/heads/dev
remote:
To http://jason@***.git
+ b26a84a...70929e1 dev -> dev (forced update)
https://blog.csdn.net/QQxiaoqiang1573/article/details/68074847 git 删除远程分支上的某次提交
A,删除最后一次提交记录
git reflog能查看所有历史操作记录,如果只想看commit信息,可以使用git log,两者都能查到commit id
git revert HEAD 将回到倒数第二次提交后的版本,但本次操作会生成commit信息进行提交(输入i进入编辑状态,编辑完信息后按ESC,接着输入:wq保存退出)
保存退出后输出如下,此时已经回退到倒数第二次提交的时候:
通过git log查看提交的记录,发现会生成一次新的commit信息,但是内容已经更新到之前的了
或者
git reset --hard HEAD^ 注意后面有个^表示将回到倒数第二次提交后的版本
操作前的提交记录
操作后的提交记录
git log
[注] revert会生成一次新的提交,之前commit的信息还在,reset 则不会保留之前的提交记录信息
B,删除历史提交中的某次或者多次提交记录
例子:删除最后一次和倒数第三次提交记录
1) git log 找到你要删除的最远的commit id,本次测试选择了红色框的commit信息进行删除,也可以通过git reflog查看commit id
git log
2) git rebase -i HEAD~5 最新提交的版本为倒数第一个版本,5表示倒数第5个版本,这个数字可以修改,如改成3进入下面的编辑页面,或者git rebase -i "commit id"^ 注意后面有个^符号,加不加“”都可以,
git rebase -i HEAD~3 (输入i进入编辑状态,删除第一行的内容,编辑完信息后按ESC,接着输入:wq保存退出)
删除第一行内容和第三行内容,即删除倒数第三次提交和最后一次提交的内容
保存退出后输出如下,此时回到删除改提交之前的那次提交后的状态,即commit信息为“删除commit信息2”
此时git log,回到了要删除commit信息前一次提交的状态
但有冲突,需要解决,冲突的文件内容如下所示
a),解决冲突文件后内容如下
git add .
git rebase --continue (直接退出文件,通过:q退出)
如果没有使用git add . 而直接使用git rebase --continue会提示下面的信息
此时输出如下:
git log发现第三次和第五次提交的commit信息已经删除了
b),不解决冲突,通过git rebase --skip 跳过解决冲突,直接回退到第三次提交后的状态。类似于使用git reset回退
git log
文件中的内容
c),不解决冲突,通过git rebase --abort回到最新提交的状态,所有东西都回到rebase前,因此此时并没有删除commit信息,要想删除就得解决冲突。
git log
在(1)完成的基础上,只需要加上git push orgin master -f 即可将master分支上的commit信息删除
git push orgin master -f
远程最新的文档内容:
1),master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
2),干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
3),每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了
1),master分支是主分支,因此要时刻与远程同步;
2),dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
3),bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
4),feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成又不想commit时,先把工作现场暂存,然后去修复bug,修复后,再git stash pop,回到工作现场。
假设暂存现场在dev分支,总体流程如下:
git stash 暂存工作现场
(去修bug,假设bug在master分支上)
git checkout master
修改bug
git add .
git commit -m "fix bug on master"
git push origin master
git checkout dev 切到dev分支
git stash list 会出现stash@{0}: WIP on dev: 6224937 add mergegit
git stash pop 将之前本地dev分支暂存的环境恢复出来
(还可以通过 git stash apply stash@{0}进行恢复,再删除stask内容git stash drop)
git stash list 再次查看还有暂存现场没有
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,用git branch -d
为了和远程库相关联需要添加key,如果不加好像每次需要输密码:
ssh-keygen -t rsa -C "***@qq.com" # 后面的邮箱根据自己的情况修改
该命令用于 创建id_rsa文件和id_rsa.pub文件,id_rsa是私钥,id_rsa.pub是公钥用于添加到github的ssh key里面。文件位于用户目录下的.ssh文件里面
第一种情况:远程只有仓库没有内容时,将本地已经写好的代码关联到远程:
git init
git add .
git commit -m "first commit"
git remote add origin [email protected]:JasonDu1993/learngit.git 关联远程库,相当于让origin等于后面这串地址
git push -u origin master -u只在第一次推送分支时使用,将本地master推到远程master分支上
关联完之后就可以切分支或者创建其他分支了
git checkout master
git push origin master 将到本地master分支内容推到远程master分支上
git checkout -b dev 创建本地dev分支并切换到本地dev分支
git push origin dev 将本地dev分支推到远程dev分支
一般master分支和dev分支都会推到远程
第二种情况:远程仓库有内容,直接克隆到本地
git clone [email protected]:JasonDu1993/gitskills.git
git branch -a 查看本地分支和远程分支
git checkout -b dev origin/dev 如果本地没有dev分支将会报错
git add file_name
git commit -m "记录提交信息"
git push origin dev
在GitHub上,可以任意Fork开源仓库,这样拥有fork后的仓库的读写权限,你就可以push到你fork之后的这个仓库了,当然也可以推送pull request给官方仓库来贡献代码。
1)如果git checkout -b dev origin/dev迁出分支出现问题
fatal: Cannot update paths and switch to branch 'dev' at the same time.
Did you intend to checkout 'orgin/dev' which can not be resolved as commit?
解决办法是先git fetch,再git checkout -b dev origin/dev
2)如果git push失败,先git pull
如果git pull失败,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
git branch --set-upstream dev origin/dev,(现在好像改成git branch --set-upstream-to=origin/dev dev)
然后在git pull,git push origin master
3)https://blog.csdn.net/love_rongrong/article/details/12557347
git error: RPC failed; result=22, HTTP code = 411
解决办法:改一下git的传输字节限制
git config http.postBuffer 524288000
4)error: RPC failed; result=22, HTTP code = 413
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
Everything up-to-date
这两个错误看上去相似,一个是411,一个是413
下面这个错误添加一下密钥就可以了
首先ssh-keygen -t rsa -C "[email protected]"生成密钥
1),从远处拉取最新的东西到本地(不想解决冲突直接接受远程仓库内容)
git fetch --all //至少下载到本地不进行合并
git reset --hard origin/dev
git pull
2),将本地更新强制推到远程,不想解决和远程的冲突
git push --force origin dev 或者git push -f origin dev
git push origin --delete dev
删除本地分支
git branch -d dev
如果想把本地的test分支提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支。
git push origin test:master // 提交本地test分支作为远程的master分支
git push origin test:test // 提交本地test分支作为远程的test分支
git fetch --all
git log
git reset --hard commit_id
1) 在本地仓库删除远程仓库:
git remote rm origin 1
2 )修改Github仓库名称:
在Github页面中,进入要修改的仓库,在页面上方选择“Settings”,即可重命名远程仓库。
3) 添加新的远程仓库:
git remote add origin https://github.com/JasonDu1993/gitskill.git
https://blog.csdn.net/matrix_google/article/details/80676034 Github进行fork后如何与原仓库同步
1)git remote -v 查看远程目录地址
2)git branch -a 查看所有分支情况
3)git remote add upstream 你fork之前的源仓库地址 该操作将源仓库和上游代码库upstream相关联(重要1)
4)git remote -v 再次查看远程目录的地址
5)git stash 暂存自己的工作状态(不是必须的,如果改了代码没有push则需要)
6)git fetch upstream 抓取源仓库的修改文件(重要2)
7)git branch -a 再次查看所有分支情况
8)git checkout master 切换到master分支
9)git merge upstream/master 将本地代码和源代码保持同步(最重要3)
10)git stash pop 将暂存区的环境恢复到工作区
上传到远程仓库
11)git add .
12) git commit -m "update forked repository at 2019.06.05"
13)git push origin master 上传新的代码到自己的远程master分支
No tracked branch configured for branch dev or the branch doesn't exist. To make your branch track a remote branch call, for example, git branch --set-upstream-to origin/dev dev
因此,多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
标签用于发布版本时使用,相当于给某次commit取个名字
git tag
git tag -a
git tag 可以查看所有标签
git tag -d
git push origin :refs/tags/
git push origin
git push origin --tags 推送全部未推送过的本地标签
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件,同时提交这个文件到Git。
例子如下,.gitignore文件内容如下:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
# iead
.idea
# My configurations:
db.ini
deploy_key_rsa
忽略文件的原则是:
1,忽略操作系统自动生成的文件,比如缩略图等;
2,忽略编译生成的中间文件、可执行文件等,比如Java编译产生的.class文件;
3,忽略敏感信息的配置文件,比如存放口令的配置文件。
假设你已经有sudo权限的用户账号并且该教程是在ubuntu下介绍的
1,安装git:
sudo apt-get install git
2,创建一个git用户,用来运行git服务:
sudo adduser git
3,创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
4,初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
sudo chown -R git:git sample.git
5,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
6,克隆远程仓库:
现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:
git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。
管理权限
使用Gitolite就是这个工具管理权限
解决:git config --global http.postBuffer 524288000
Cloning into 'survivors'...
remote: Counting objects: 124, done.
remote: Compressing objects: 100% (120/120), done.
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
解决:git clone http://github.com/large-repository --depth 1
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
解决:
方法一:git config --global http.postBuffer 524288000
如果不行
方法二:git clone http://github.com/large-repository --depth 1
如果还不行
方法三:一般clone http方式的容易产生此问题,改成SSH的方式也有效,即https://改为git://