GitHub发现开源项目,提高工作效率
本文是《learn-github-from-zero》读书笔记,做了一些简洁化修改。
主要内容是GitHub页面介绍、Git Bash基础命令、GIT进阶、Git Flow分支管理流程和最后的开源项目参与。不包含GitHub账号注册、Git Bash下载安装、ssh密钥等内容。(这部分可参考《GitHub 新手详细教程》)
初始化本地仓库,推送到空的git 仓库。create a new repository on the command line
echo "# nlp-transformers" >> README.md
git init#本地仓库初始化
git add README.md
git add .#添加当前目录所有文件
git commit -m "first commit"
#此时本地仓库默认分支是master,直接提交需要合并到远程仓库mian,比较麻烦
git branch -M main#将本地仓库默认改为mian分支
git remote add origin https://github.com/zhxnlp/nlp-transformers.git
git push -u origin main
推送现有本地仓库
#git remote add origin https://github.com/zhxnlp/nlp-transformers.git |
每次提交貌似都要全部提交,即git add.
1.个人主页
我的 Timeline,这部分你可以理解成微博,就是你关注的一些人的活动会出现在这里,比如如果你们关注我了,那么以后我 star、fork 了某些项目就会出现在你的时间线里。
个人主页your profile
2.基本概念
Repository
仓库的意思,即你的项目,你想在 GitHub 上开源一个项目,那就必须要新建一个 Repository
,如果你开源的项目多了,你就拥有了多个 Repositories 。
Issue
问题的意思,举个例子,就是你开源了一个项目,别人发现你的项目中有bug,或者哪些地方
做的不够好,他就可以给你提个 Issue ,即问题,提的问题多了,也就是 Issues ,然后你看
到了这些问题就可以去逐个修复,修复ok了就可以一个个的 Close 掉。
Star
这个好理解,就是给项目点赞,但是在 GitHub 上的点赞远比微博、知乎点赞难的多,如果你有一个项目获得100个star都算很不容易了!
==Fork==
可以翻译成分叉。你开源了一个项目,别人想在你这个项目的基础上做些改进,然后应用到自己的项目中,这个时候他就可以 Fork 你的项目。
这个时候他的 GitHub 主页上就多了一个项目,只不过这个项目是基于你的项目基础(本质上是在原有项目的基础上新建了一个分支,分支的概念后面会在讲解Git的时候说到),他就可以随心所欲的去改进,但是丝毫不会影响原有项目的代码与结构。
==Pull Request==
发起请求,这个其实是基于 Fork 的,还是上面那个例子,如果别人在你基础上做了改进,后来就想把自己的改进合并到原有项目里,这个时候他就可以发起一个 Pull Request(简称PR) ,原有项目创建人就可以收到这个请求,这个时候他会仔细review你的代码,并且测试觉得OK了,就会接受你的PR,这个时候你做的改进原有项目就会拥有了。
Watch
这个也好理解就是观察,如果你 Watch 了某个项目,那么以后只要这个项目有任何更新,你
都会第一时间收到关于这个项目的通知提醒。
Gist
有时候你没有项目可以开源,只单纯的想分享一些代码片段,这个时候 Gist 就派上用场了!
3.操作起来
创建一个项目需要填写如上的几部分:项目名、项目描述与简单的介绍,你不付费没法选择私有的,所以接着只能选择 public 的,之后勾选「Initialize this repository with a
README」,这样你就拥有了你的第一个 GitHub 项目:
可以看到这个项目只包含了一个 README.md 文件,但是它已经是一个完整的 Git 仓库了,你可以通过对它进行一些操作,如watch、star、fork,还可以 clone 或者下载下来。GitHub 上所有关于项目的详细介绍以及 Wiki 都是基于Markdown 的。
3.Git 速成
Git 是当下最方便最流行的==版本控制系统==,软件开发中源代码的管理变得异常重要:
比如为了防止代码的丢失,肯定本地机器与远程服务器都要存放一份,而且还需要有一套机制让本地可以跟远程同步;多人开发互不影响、bug紧急修改、查看历史更改记录等等。
安装好Git-bash之后,Git命令如下:
3.1git命令
3.2 git本地操作
在进行任何 Git 操作之前,都要先切换到 Git 仓库目录,也就是切换到项目的文件夹目录下。Git 所有的操作命令开头都要以 git 开头。
==首先创建一个新的文件夹并初始化为仓库==
mkdir test (创建文件夹test)
cd test (切换到test目录)
git init(初始化为仓库)
git status(查看状态)
默认就直接在 master 分支,输入后可以看到a.md 文件Untracked files ,就是说 a.md 这个文件还没有被跟踪,没有提交在 git 仓库里呢,可以使用 git add
a.md提交的文件。
提交文件git add
再输入git status
,此时提示以下文件 Changes to be committed , 意思就是 a.md 文件等待被提交,当然你可以使用 git rm --cached 文件名
这个命令去移除这个缓存。或者 git commit -a -m "first commmt"
移除名为 “first commmt”的提交。(你妹的,本地也给我删了)
git commit
接着我们输入 git commit -m "first commit"
,这个命令什么意思呢? commit 是提交的意思,-m 代表是提交信息,执行了以上命令代表我们已经正式进行了第一次提交。这个时候再输入 git status ,会提示 nothing to commit。
查看提交记录git log
这个时候我们输入 git log 命令,会看到如下:
==git log 命令可以查看所有产生的 commit 记录==,所以可以看到已经产生了一条 commit 记录,而提交时候的附带信息叫 ‘first commit’ 。
git commit -am
看到这里估计很多人会有疑问,我想要提交直接进行 commit 不就行了么,为什么先要再 add一次呢?首先 git add 是先把改动添加到一个「暂存区」,你可以理解成是一个缓存区域,临
时保存你的改动,而 git commit 才是最后真正的提交。这样做的好处就是防止误提交,当然
也有办法把这两步合并成一步,使用==git commit -am==就可以了。
新建分支git branch a
branch 即分支的意思,多人协作中很重要。每个人建立自己的分支,互不影响,最后合并。
执行 git init 初始化git仓库之后会默认生成一个主分支 master(默认分支),也基本是实际开发正式环境下的分支。一般情况下 ,不要在master 分支上直接操作的。
执行 git branch a 新建了 a 分支(分支 a 跟分支 master 是一模一样的内容)可以输入 git branch 查看下当前分支情况。
切换分支git checkout a
新建并自动切换分支git checkout -b a
删除分支git branch -d
分支新建错了,或者a分支的代码已经顺利合并到master 分支来了,那么a分支没用了,需要删除。如果a分支的代码还没有合并到master,你执行 git branch -d a 是删除不了的,它会智能的提示你a分支还有未合并的代码。
强制删除分支git branch -D
合并分支git merge
第一步是切换到 master 分支
第二步执行 git merge a ,合并a分支。但有时候会有冲突合并失败
添加版本标签git tag
git tag v1.0 就代表我在当前代码状态下新建了一个v1.0的标签,输入 git tag 可以查看历史 tag 记录。执行 git checkout v1.0 ,这样就顺利的切换到 v1.0 tag的代码状态了。
3.3向 GitHub 提交代码
3.3.1生成SSH
SSH是一种网络协议,用于计算机之间的加密登录。大多数 Git 服务器都会选择使用 SSH 公钥来进行授权,所以想要在 GitHub 提交代码的第一步就是要先添加 SSH key 配置。
输入 ssh-keygen -t rsa ,什么意思呢?就是指定 rsa 算法生成密钥,接着连续三个回车键(不需要输入密码),然后就会生成两个文件 id_rsa 和 id_rsa.pub ,而 id_rsa 是密钥,id_rsa.pub 就是公钥。
接下来要做的是把 id_rsa.pub 的内容添加到 GitHub 上,这样你本地的 id_rsa 密钥跟 GitHub上的 id_rsa.pub 公钥进行配对,授权成功才可以提交代码。(更多内容可以看其它的介绍)
GitHub 新手详细教程和这篇Git生成公钥 bash。
- 查看公钥:
cat ~/.ssh/id_rsa.pub
3.3.2
从仓库克隆到本地时报错,是因为config —list的最后一行为false。输入fatal: bad boolean config value '“false”' for 'http.sslverify
git config --global --edit
将最后一行删掉。
也可以看到自己的账户信息3.3.3
git clone时出现错误原因是curl的postBuffer的默认值较小,需要在终端调整为到合适的大小,这里调整到500Merror: RPC failed curl 56 OpenSSL SSL read Connection was reset
。
git config --global http.postBuffer 524288000 |
3.3.4 unable to access ‘https:...‘: OpenSSL SSL_read: Connection was reset, errno 10054
。
使用git clone 指令获取github项目时报错。解决方法,将url链接地址中的https改写为git。push时报错可以重启git bash。
git clone https://github.com/....git |
push时失败报这个错:
解决方法一:取消 git 对 SSL 的检验:git config --global http.sslVerify "false"
解决方法二:在git隐藏文件夹下:将 .git/cofig 文件中的 url 进行修改url = https://github.com/zhxnlp/nlp-transformers.git
改为url = git@github.com:zhxnlp/nlp-transformers.git
3.3.5 github push时 登录失败,但明明输入的是正确的账号密码
执行 :git update-git-for-windows
执行后,会更新git git更新 重新push的界面如下
这样只要你网页等登录github ,就可以登录了
3.3.6 remote: Support for password authentication was removed on August 13, 2021.(SSH令牌解决法)
大意:远程:2021 年 8 月 13 日移除了对密码身份验证的支持。请改用个人访问令牌。
即github不支持密码验证的方案了,用personal access token
代替。
在Github上生成token
GitHub 帐户,转到Settings => Developer Settings => Personal Access Token => Generate New Token (Give your password) => Fill up the form(选择所有选项) => Generate token =>复制generated Token。它将类似于ghp_sFhFsSHhTzMDreGRLjmks4Tzuzgthdvfsrta(刷新就看不到了,要及时保存)将本地的凭证改为
Personal Access Token
控制面板 -> 凭据管理器(或者直接控制面板搜索凭证打开) -> Windows凭据 -> 找到git:https://github.com
,将凭据改为前面生成的token即可。
之前没有github凭证的,单击添加通用凭据=> 互联网地址将是git:https://github.com
,用户名为gith邮箱。密码是GitHub 个人访问令牌。
3.7 git commit 提交不了 error: pathspec 'project'' did not match any file(s) known to git.
在Linux系统中,commit信息使用单引号,而windows系统,commit信息使用双引号。
所以在git bash中git commit -m ‘提交说明’ 这样是可以的,但是在win命令行中就要使用双引号
3.8 error: failed to push some refs to ''xxx.git'
报错:hint: Updates were rejected because the remote contains work that you do
估计是本地和远程仓库代码不一致冲突了。
git push origin master -f
强制覆盖远程仓库- 在git push前执行git pull命令,如下:
git pull origin mian |
3.4. Push & Pull
Push推送代码 :
把本地代码推到远程仓库,使本地仓库跟远程仓库就可以保持同步了。
代码示例:
==git push origin master==:本地代码推到远程 master 分支。
Pull下载远程仓库代码
==git pull origin master==:把远程最新的代码更新到本地。
一般我们在 push 之前都会先 pull ,这样不容易冲突。
3.4.2 提交本地文件到github
提交当前目录下所有文件:git add.
此时可能报错:The file will have its original line endings in your working directory
首先出现这个问题主要原因是:我们从别人github地址上通过git clone下载下来,而又想git push到我们自己的github上,那么就会出现上面提示的错误信息。
这是因为文件中换行符的差别导致的。这个提示的意思是说:会把windows格式(CRLF(也就是回车换行))转换成Unix格式(LF),这些是转换文件格式的警告,不影响使用。
git默认支持LF。windows commit代码时git会把CRLF转LF,update代码时LF换CRLF。
此时需要执行如下代码:git rm -r --cached .
git config core.autocrlf false
git add .
git commit -m 'first commit'
Your branch is ahead of 'origin/main' by 1 commit. |
意思是本地仓库有一个提交,比远程仓库要先进一个commit.
需要先把这个commit提交到远程仓库
$ git push origin main |
3.5. 提交代码
向 GitHub 上我们提交我们自己的项目代码。有两种方法:
1.克隆GitHub的项目 ,修改后再push
以GitHub 上创建的 test 项目为例,执行如下命令:
git clone git@github.com:stormzhang/test.git
这样就把 test 项目 clone 到了本地(这个时候该项目本身就已经是一个git 仓库了,不需要执行 git init 进行初始化,而且都已经关联好了远程仓库)我们只需要在这个 test 目录下任意修改或者添加文件,然后进行 commit ,之后就可以执行push来提交:
git push origin master
仓库地址如下图:
2.关联本地已有项目,上传到GitHub
如果我们本地已经有一个完整的 git 仓库,并且已经进行了很多次 commit,这个时候第一种方法就不适合了。
假设我们本地有个 test2 的项目,需要上传到GitHub。可执行如下操作:
首先:在GitHub 上建一个 test 的项目
其次:把本地 test2 项目与 GitHub 上的 test 项目进行关联
切换到 test2 目录,执行如下命令:
git remote add origin git@github.com:stormzhang/test.git
然后把本地test2 上的所有代码 commit 记录提交到 GitHub 上的 test 项目。
意思是==添加一个远程仓库,仓库名字是origin== ,地址是git@github.com:stormzhang/test.git
(只有一个远程仓库时名字一般都叫 origin 。我们可能一个项目有多个远程仓库?比如 GitHub 一个,比如公司一个,这样的话提交到不同的远程仓库就需要指定不同的仓库名字了。)
查看我们当前项目有哪些远程仓库可以执行如下命令:
git remote -v
接下来,==本地仓库向远程仓库进行代码提交==:
git push origin master
默认==向 GitHub 上的 master 分支的test 目录提交代码==。在提交代码之前先要设置下自己的用户名与邮箱。
3.6 ipynb文件转为md文件
在要转换的ipynb文件当前目录下打开cmd,运行以下代码jupyter nbconvert —to markdown lightGBM.ipynbjm=“jupyter nbconvert --to markdown”
jm docs/篇章4-使用Transformers解决NLP任务/4.1-文本分类.ipynb
jm docs/篇章4-使用Transformers解决NLP任务/4.2-序列标注.ipynb
3.7 解决github或gitee上传的md文件中[TOC]标签无法生成目录
- 打开VScode,点击扩展,搜索
Markdown All in One
插件,安装 - 在VScode中打开md文件
- 使用Ctrl+Shift+P快捷键,输入命令
Markdown All in One: Create Table of Contents
,回车
然后你存的任何东西都在drive的首页路径下了,下次读取之前也先跑上面这段代码。如果想更改其他路径,用os.chdir即可。
==恢复模型==(保证前面挂载了Google Drive的前提下,进行恢复)
PATH = './drive/My Drive/tran.pth' |
PATH = './drive/My Drive/tran.pth' |
- 利用文件复制命令,将文件保存至云端硬盘
!cp -r "要保存的文件路径" "/content/drive/My Drive/**" |