






















SSH / Personal Access Tokens / GPG Keys / Signing Key / ssh-agent
裸中央仓库 / worktree
…
通过 ssh key 等方式操作 github 等仓库平台时,只要 ssh 验权通过就可以进行仓库操作。不过对于 git commit 等提交操作,git 会强制要求配置 username 和 email。
不过,email 一定要配置好,和账号的 email 一致。github 虽然不对 email 进行操作验证,但是在显示 verified 等标记的时候,还是会校验 email 的。如果 email 不对,则标记 Unverified。
整体来说,虽然不强求,但尽量配置好。
github 这些 git 平台,除了 https 之外,也支持 git 协议的 ssh 操作。
对于公私钥,本机主要使用私钥,公钥在 github 远程平台上设置。
1 | tree ~/.ssh/ |
当需要在一台主机上管理多个 github 账号的时候,需要在 config 文件中进行如下配置:
1 | > cat ~/.ssh/config |
对应的 git clone 地址也需要做改变:
1 | git clone [email protected]:octocat/test.git |
一般操作,使用 SSH Key 的情况下,不需要设置 PAT。
SSH 认证
[email protected]:user/repo.git 格式地址~/.ssh/ 目录的密钥对ssh -T [email protected] 验证连接HTTPS 认证
https://github.com/user/repo.git 格式地址1 | git remote -v |
gh) 操作敏感资源git 客户端(命令)会在用户输入 PAT 后,将 PAT 存储到 mac 的 keychain 中,并和 github domain 绑定。
这个时候,如果有多个 github 账号,就会发生冲突,导致其中一个 github 账号下面的 pat 验证失败。
所以,需要使用 https://github.company.com/xxx/xx.git 或 https://alias.github.com/xxx/xx.git 这样的格式,来对不同的 github 账号进行区分。
URL 协议本身是支持增加 username 和 password 的,即 https://username:[email protected]/xxx/xx.git。
这个时候,可以把 username 换成 github 账号,password 换成 PAT,就可以在通过 github 授权的情况下操作 xx 仓库了。
原理:
不推荐,简单实用一下还是可以的。
github 推出的 commit / tag 等操作的签名认证。被签名的 commit 会在历史记录中显示一个绿色的 verified 标记。
GPG Keys 是专门做这个事情的,其中,github 也推出了自己的 Signing Key,可以复用 SSH Keys 的设置(操作入口在同一个地方)。
具体配置如下,通过在 ~/.gitconfig 中增加 url 分流配置,可以为不同的 host 组设置不同的 signing 规则。
1 | // ~/.gitconfig-github-personal |
1 | // ~/.gitconfig-github-work |
1 | // ~/.gitconfig |
ssh 和 ssh-agent 都是 openssh 的一部分。对于 ssh 而言,公私钥中,私钥是可以被加密的,加密后,私钥就无法被直接使用,需要使用 passphrase 进行解密后才能使用。
这个时候操作流程就比较复杂,每次使用 ssh 的时候,ssh 命令通过操作系统弹窗,让用户输入 passphrase,然后对私钥原始内容进行解密获取私钥再使用。
ssh-agent 就是一个内存服务,ssh 拿到解密后的私钥后,直接放到 ssh-agent 中,后续直接从 ssh-agent 中进行读取。
这个时候又会遇到一个问题,就是 macos 系统重启了,ssh-agent 内存数据消失了。所以 ssh 会把 passphrase 存储到 keychain 中,下次启动时,会自动从 keychain 中读取 passphrase。
具体流程是:
配置 ssh-agent 示例 (UseKeychain & AddKeysToAgent):
1 | > cat ~/.ssh/config |
via https://swiftrocks.com/what-happens-when-you-move-a-file-in-git
【裸仓库】是一个不包含工作区(working tree)的 Git 仓库,只包含 Git 版本库数据(.git 目录中的内容)。在 github 等平台上,我们通过 push、pull 操作的远程仓库,都是【裸仓库】,因为它们只需要存储版本数据,不需要工作区。
裸仓库 一般使用 xx.git 命名文件夹,内部没有工程目录,完全是 git 操作目录,如下:
1 | tree |
git init --bare example.gitgit clone ./path/to/example.git example1 | NAME |
git worktree - 管理多个工作目录
核心功能: 允许你从一个 Git 仓库创建多个独立的工作目录,方便同时处理不同分支或任务。
常用命令:
git worktree add <path> [<branch>] - 创建新的工作目录<path> 创建新的工作目录,并检出 [<branch>] 分支 (默认当前分支)。f: 强制创建,即使目录已存在 (小心数据丢失)。-detach: 创建分离 HEAD 的工作目录 (不关联分支)。b <new-branch>: 创建并检出新分支。git worktree add -b feature-branch ../feature-branch: 创建新分支 feature-branch 并检出到新工作目录。git worktree add ../working-dir feature-branch: 检出已存在的 feature-branch 分支到新工作目录。git worktree add ../hotfix origin/main: 创建 hotfix 工作目录 (基于 origin/main)。git worktree list - 列出工作目录v: 显示更详细的信息。git worktree remove <path> - 删除工作目录<path> 指定的工作目录。f: 强制删除,即使工作目录不干净 (小心数据丢失)。git worktree lock <worktree> - 锁定工作目录<worktree>,防止被 git worktree remove 删除。-reason <string>: 添加锁定原因。git worktree unlock <worktree> - 解锁工作目录<worktree>,使其可以被 git worktree remove 删除。git worktree move <worktree> <new-path> - 移动工作目录<worktree> 移动到 <new-path>。git worktree prune - 清理无效信息n: 模拟运行,不实际删除。git worktree repair - 修复工作目录Git 对文件夹和文件的大小写,是不敏感的。有些 IDE 会默认做很多事情,让用户无感知。当不通过 IDE 操作 Git 的时候,开发过程中有可能遇到【修改文件夹 / 文件名】无效的场景。
孤儿分支,是指没有父分支的分支。场景:
1 | git switch --orphan new-branch |
new-branch 将成为独立 commit 节点,没有任何父节点,并且 git 状态和 old-branch 一致。
后面可以新增 remote url,将 new-branch 推送到远程仓库。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。