Skip to content

Github

限定词搜索

在 Github 中搜索关键词,通常会找到大量无关紧要的内容,如果需要精确搜索,就需要使用 Github 提供的限定词功能进行搜索。

以搜索 ChatGPT 为例,可以指定项目名称中包含 ChatGPT: ChatGPT in:name, 通过限定词 in,将搜索范围限定在项目的 name 字段上,这样就可以缩小搜索范围。

Github 限定词

限定词使用方式描述
in见 in 限定词表格
is见 is 限定词表格
useruser:lunode在用户 lunode 中搜索
orgorg:vuejs在 vuejs 组织中搜索
forksforks:>1000forsk 数大于 1,000
starsstars:>1000star 数大于 1,000
languagelanguage:python编程语言是 python
createdcreated:>2024-01-02创建时间在 2024 年 1 月 1 日之后
updatedupdated:>2024-01-01更新时间在 2024 年 1 月 1 日之后
pushedpushed:>2024推送时间在 2024 年 1 月 1 日之后

in 限定词有很多限定范围:

in 限定词范围使用方式描述
repoin:repo限定在残酷中搜索
filein:file限定在文件中搜索
pathin:path限定在路径名称中搜索
readmein:readme限定在 README.md 中搜索
descriptionin:description限定在项目描述中搜索
commitin:commit限定在提交信息中搜索
codein:code限定在代码内容中搜索
issuein:issue限定在 issue 中搜索

is 限定词有一些限定范围:

is 限定词范围使用方式描述
publicis:public公开仓库
privateis:private私有仓库
forkis:fork是 fork 的仓库

Github cdn 加速访问

https://cdn.jsdelivr.net/gh/${user}/${repo}@${path/to/file}

Github 登录授权 Authentication

当将仓库推送到 Github 时,需要登录 Github 获取登录授权,不然无法推送或者拉取。

目前主要有两种登录方式,一种是 SSH 登录的方式,一种是登录凭据 Credential 方式。

SSH 方式相对比较简单,Credential 配置相对麻烦一点,但是当使用 Dev in Container 时,SSH 需要额外花不少配置来去处理容器中的 Github 授权问题,而 Credential 登录凭据方式,则不需要任何处理,VSCode 在容器中打开文件夹的时候,会将 Git 的 Credential 授权凭据拷贝到容器中,所以在容器中直接就会获取到宿主机的 Github 的 Git 登录凭据;如果宿主机没有登录凭据,那么则会拷贝本地的凭据到远程服务器上的开发容器中。

SSH 登录认证方式

SSH 登录认证方式只需要在本地生成一个公私钥,将公钥添加到 Github 的配置中,然后在本地的 SSH config 中配置 SSH 登录 Github 的配置即可。

打开 SSH 配置文件:

code ~/.ssh/config

添加 Github 的登录方式:

conf
Host github.com
  HostName github.com
  User lunode
  IdentityFile ~/.ssh/id_rsa
  PreferredAuthentications publickey

需要注意的是,使用 SSH 认证方式,配置仓库的 remote-url 时,必须是 SSH 协议的 url 仓库链接,如果是 HTTPS 协议的,则不会走 SSH 登录认证,而是 Credential 登录凭据方式。

Credential 登录凭据方式

可以通过命令查看当前 Git 仓库的 Git 配置,或者全局的 Git 配置。

sh
# 查看仓库的 git 配置
git config --list
# 查看全局的 git 配置
git config --global --list

如果 Git 全局并没有配置,则需要考虑是使用 SSH 登录认证方式,还是使用 Credential 登录凭据方式,如果是 SSH 登录认证方式,只需要配置一下全局的用户和邮箱,然后配置一下 SSH config。

sh
git config --global user.name lunode
git config --global user.email 48537416+lunode@users.noreply.github.com

这样所有 Git 仓库都会继承全局的用户信息,用户也可以在每个 Git 仓库配置用户信息,用来覆盖全局配置,只需要去掉 --global 选项即可。

如果需要配置 Credential 登录凭据认证方式,则需要配置

sh
git config --global user.name lunode
git config --global user.email 48537416+lunode@users.noreply.github.com
git config --global credential.helper store

credential.helper 的可选配置有 3 种

  • cache

    缓存在内存中 15 分钟

  • store

    默认存储在 ~/.git-credentials 文件中

  • Git Credential Manager

    如果是 MacOS,则会存在 osxkeychain 中 如果是 Windows 会存储在 Git Credential Manager for Windows 中(windows 中使用图形化安装 Git 时会让用户选择此选项来安装 Git Credential Manager for Windows)

对于 Git Credential Manager,widnows 会在安装时默认安装,MacOS 则不需要,因为可以存储到 osxkeychain 中,对于 Linux 系统,则安装起来比较麻烦,具体可以参考 Github 文档

对于 Credential 的处理,还可以参考书籍 Pro Git,也可以参考 CSDN 文章

对于 Windows 和 Mac 用户来说,是不需要额外安装 Git Credential Manager 的,只有 Linux 环境需要这样做。

而在 Linux 环境中安装 Git Credential Manager 是比较麻烦的,更建议使用 store 的方式,将登录凭据的内容存储到具体文件中,这样做一个是容易,另外就是当 Dev in Container 时,VSCode 会将宿主机的登录凭据拷贝到容器,这样容器就不需要任何配置处理,就可以使用宿主机的登录凭据了。

如果宿主机没有登录凭据,并且用户通过 VSCode remote 打开的远程服务器文件夹或者远程服务器的开发容器,那么则会将本地的登录凭据拷贝到容器中,这本来没有什么问题,但如果用户本地和远程服务器中需要使用不同的用户的话,则需要在宿主机上主动配置好用户登录凭据

虽然已经配置好登录凭据存储在 ~/.git-credentials 文件中了,但还没有真的将凭证写入进去,可以通过 命令查看 Git 全局配置。

sh
git config --global --list

输出:

user.name=lunode
user.email=48537416+lunode@users.noreply.github.com
credential.helper=store

或者直接查看 Git 的全局配置文件~/.gitconfig

sh
cat ~/.gitconfig

输出:

[user]
        name = lunode
        email = 48537416+lunode@users.noreply.github.com
[credential]
        helper = store

可以使用命令来添加登录凭据文件中存储内容

sh
git credential approve

在交互终端中输入:

sh
protocol=https
host=github.com
username=lunode
password=******

输入完密码后,再输入一行空行,然后 Enter 提交,内容就会存入到默认的 ~/.git-credentials

提醒

Github 已经拒绝了密码认证方式,所以输入 password 的时候不是填写 Github 的登录密码,而是需要填入 ACCESS_TOKEN。

使用命令查看存储到文件中的登录凭据

sh
cat ~/.git-credentials

输出:

https://lunode:******@github.com

提示

.git-credentials 文件如果有多个登录凭据,当使用 git clone 仓库时,会使用第 1 个登录凭证,即使在 git 全局配置了 user.name 和所克隆的仓库主人一致,git 也不会智能的去检取对应用户的登录凭据,而是直接使用第 1 个登录凭证。

也可以通过命令来获取凭据信息

sh
git credential fill

会进入交互,输入查询信息

conf
protocol=https
host=github.com

然后命令就会返回查询到的用户凭据,根据查询信息可能会返回多个用户凭据

conf
username=lunode
password=******

git credential 命令

git credential 命令是用来管理 git 凭据的

sh
# 默认存储在 ~/.git-credentials 文件中
git config --global credential.helper store
# 也可以指定其他 credentials 存储文件
git config --global credential.helper 'store --file ~/.other-credentials'

可以通过 git credential <fill|approve|reject> 来操作 credentials, git credential 命令都是根据全局 .gitconfig 配置内容来操作凭据存储的,如果配置的是 store,则操作的是默认的 ~/.git-credentials 文件,如果 store 指定了其它文件,则 git credential 会将登录凭据的操作写入到对应的文件,如果 store 的方式是内存,则会存储到内存中。

写入凭据

git credential approve

出现交互输入,可以将全部数据写入,并且以空行结尾,然后 Enter 确认

conf
protocol=https
host=github.com
user=lunode
password=******

或者换一个形式:

sh
echo "protocol=https
host=github.com
user=lunode
password=******" | git credential approve

也可以在交互输入中只输入 protocol 和 host,并且以空行结尾,然后 Enter 确认

protocol=https
host=github.com

这时候,会出现登录交互:

Username for 'https://github.com': lunode
Password for 'https://lunode@github.com': ******

提醒

Github 已经拒绝了密码认证方式,所以输入 password 的时候不是填写 Github 的登录密码,而是需要填入 ACCESS_TOKEN。

数据内容会保存在 .gitconfig 配置中,store 配置项指定的文件中,如果没有指定具体文件,则默认是 ~/.git-credentials

sh
cat ~/.git-credentials

输出:

https://lunode:******@github.com

登录凭据文件的存储规律也一目了然,也可以自己手动往存储登录凭据的存储文件中写入登录凭据。

查询凭据

git credential fill

出现交互输入,输入一行空格行后,Enter 确认提交

protocol=https
host=github.com

或者换一种形式查询

sh
echo "rotocol=https
host=github.com" | gire credential fill

会返回查询到的登录凭据,由于登录凭据可能会有多个,而 protocol+host 只能限制到 github.com 下的所有用户,如果有多个 github 用户,则会返回多个。

提示

对于查询条件可以自行限定调整,不外乎 protocol,host,username 的排列组合

如果查询不到,则会跳出 Github 登录框,输入用户名密码,但是并不会保存到登录凭据中,只是临时打印到终端。

删除登录凭据

可以使用 protocol,host,username 参数来定位一个用户的登录凭据

sh
git credential reject

交互式输入,以空格行结尾,然后 Enter 提交,删除查询到的用户凭据

protocol=https
host=github.com
user=lunode

git credential-store 命令

git credential-store 命令和 git credential 命令关系不大,它只是 git 提供的一个辅助命令,用来帮助将用户凭据写入到默认或者指定的文件,git 并不会使用这条命令写入的登录凭证,除非在 Git 的全局或者仓库配置中,指定了的凭据存储文件和 git credential-store 写入凭据的文件一致。

它和 git credential 命令不一样, git credential 命令是根据 .gitconfig 或者仓库配置文件的内容来写入的,并且不会区分 credential.helper 的 cache,store,manager 类型,git credential 命令是只要有设置 credential.helper,使用 git credential 操作登录凭据后,就会将操作同步到 credential.helper 配置的类型中。

sh
# 不写文件,就默认往 ~/.git-credentials文件中写,从而导致影响到git的登录凭证的现象
# 实际上影响git登录凭证主要还是看git的全局或者仓库配置的 credential.helper 配置项
git credential-store store
git credential-store store --file '~/.other-credential'

出现交互输入,可以将全部数据写入,并且以空行结尾,然后 Enter 确认

conf
protocol=https
host=github.com
user=lunode
password=******

或者换一个形式:

sh
echo "protocol=https
host=github.com
user=lunode
password=******" | git credential approve

也可以在交互输入中只输入 protocol 和 host,并且以空行结尾,然后 Enter 确认

protocol=https
host=github.com

然后出现 Github 的登录交互:

Username for 'https://github.com': lunode
Password for 'https://lunode@github.com': ******

提醒

Github 已经拒绝了密码认证方式,所以输入 password 的时候不是填写 Github 的登录密码,而是需要填入 ACCESS_TOKEN。

从文件中获取登录凭据

sh
echo "pprotocol=https
host=github.com" | git credential-store
#
echo "pprotocol=https
host=github.com" | git credential-store --file
git credential-store get

多账户

对于 github 多账户,可以往登录凭据 store 里面写入多个 Github 账户的登录凭据,具体到某一个项目仓库时,需要为项目仓库设置好用户名,用户邮件,和 remote-url(如 origin),git 会根据 remote-url 来判断使用哪个账户凭据作为 Github 鉴权用,而项目仓库级别的用户名和邮件用来添加到 commit 信息中。

也可以参考 Github 多账户文档