To-Do

  1. Gitlab runner

  2. GitHub action

  3. Gogs https://gogs.io/

 

 

git object

 

.git 目录结构

 

在你初始化了一个新的 Git 仓库后,目录结构 .git 文件夹包含了一些关键的文件和子目录,它们共同构成了一个 Git 仓库的核心。让我们详细解释一下其中每个文件和目录的作用:

  1. HEAD:

    • 这个文件包含了当前被检出的分支的引用。默认情况下,它指向 refs/heads/master,也就是 master 分支。

  2. config:

    • 这个文件包含了仓库的配置选项。可以在这里设置用户信息、别名、钩子等。你也可以用 git config 命令来修改这个文件。

  3. description:

    • 这个文件通常用于描述仓库的内容。这在 GitWeb 这样的 Git 浏览工具中会被用到。

  4. hooks:

    • 这个目录包含了一些示例钩子脚本(以 .sample 结尾)。你可以根据需要自定义这些钩子脚本,以便在不同的 Git 操作(如提交、推送等)发生时执行特定的操作。

  5. info:

    • 这个目录通常包含一些不需要版本控制的信息文件。exclude 文件是在全局 .gitignore 文件之外的额外忽略文件列表。

  6. objects:

    • 这个目录用于存储所有的数据对象,包括提交对象、树对象和文件对象。Git 使用哈希值(SHA-1)作为对象的唯一标识符。

    • infopack 子目录分别用于存储对象的额外信息和打包对象。

  7. refs:

    • 这个目录包含了指向提交对象的引用(即分支和标签)。

    • heads 子目录包含了本地分支。

    • tags 子目录包含了标签。

详细解释一些关键概念和文件的作用

通过这些文件和目录,Git 能够高效地管理版本控制工作。希望这些解释对你理解 Git 的内部结构有所帮助!

 

什么是hooks?

Git 钩子(hooks)是一种机制,允许你在特定的 Git 操作发生时自动执行自定义脚本。钩子可以帮助自动化各种工作流,比如代码检查、测试、部署等。

Git 钩子有两种类型:

  1. 客户端钩子:这些钩子在客户端仓库中运行,通常用于检查代码质量或执行其他本地操作。

  2. 服务器端钩子:这些钩子在服务器端仓库中运行,通常用于执行访问控制或其他服务器端操作。

钩子的工作原理

当你执行一个 Git 操作(如提交、推送等)时,Git 会检查相应的钩子文件是否存在。如果存在且是可执行的,Git 会在执行该操作前或后调用这个钩子脚本。

钩子脚本可以是任何可执行文件,比如 Shell 脚本、Python 脚本等。钩子文件的命名必须与 Git 预定义的钩子名称一致,并且需要去掉 .sample 后缀。

这些钩子可以帮助你在不同的 Git 操作过程中自动执行各种任务,实现代码质量控制、自动化部署、权限管理等功能。希望这些使用场景能帮助你更好地理解和应用 Git 钩子。

钩子目录中的每个 sample 文件

以下是 .git/hooks 目录中每个示例钩子(.sample 文件)的详细解释:

  1. applypatch-msg.sample:

    • git am 应用补丁前触发。主要用于修改或验证补丁的提交消息。

    • 使用场景:在使用 git am 应用补丁时,确保提交消息符合团队的格式规范。例如,你可以检查提交消息是否包含特定的关键字或遵循特定的格式。

    • 示例:确保提交消息以 JIRA 任务号开头。

  2. commit-msg.sample:

    • git commit 创建提交对象前触发。可以用于验证或修改提交消息。

    • 使用场景:在提交代码时,验证提交消息是否符合规范,或者自动添加一些信息。例如,确保提交消息的长度不超过 50 个字符,并且以动词开头。

    • 示例:添加一个脚本检查提交消息是否符合 Conventional Commits 规范。(强烈建议读一遍)

  3. fsmonitor-watchman.sample:

    • 用于与 Watchman 集成以提高文件系统监视性能。主要用于性能优化。

    • 使用场景:在大型项目中,通过集成 Watchman 提高文件系统监视性能,减少 Git 操作的等待时间。

    • 示例:在包含大量文件的仓库中,使用 Watchman 监视文件变化,提高 git status 的速度。

  4. post-update.sample:

    • git push 更新服务器端仓库后触发。常用于通知其他系统更新或触发部署脚本。

    • 使用场景:在服务器端更新仓库后,通知相关系统或触发后续操作。例如,通知 CI/CD 系统触发构建和部署。

    • 示例:在推送到远程仓库后,触发 Jenkins 构建任务。

  5. pre-applypatch.sample:

    • git am 应用补丁前触发。可以用于检查补丁的有效性或执行其他验证。

    • 使用场景:在应用补丁前,检查补丁的有效性或执行代码风格检查。例如,确保补丁中的代码符合团队的代码风格规范。

    • 示例:在应用补丁前运行 lint 工具,检查代码风格问题。

  6. pre-commit.sample:

    • git commit 创建提交对象前触发。常用于代码风格检查、运行测试等。

    • 使用场景:在提交代码前,进行代码检查、测试等操作。例如,运行单元测试,确保代码没有引入新的错误。

    • 示例:在提交代码前,运行 eslintjest,确保代码风格和单元测试通过。

  7. pre-merge-commit.sample:

    • git merge 提交前触发。可以用于验证合并是否符合预期。

    • 使用场景:在合并提交前,检查合并是否符合预期。例如,确保合并不会引入冲突或破坏现有功能。

    • 示例:在合并前运行集成测试,确保合并不会引入新的错误。

  8. pre-push.sample:

    • git push 推送到远程仓库前触发。可以用于检查推送内容或执行其他验证。

    • 使用场景:在推送到远程仓库前,进行代码检查或验证。例如,确保推送的代码已经通过所有测试。

    • 示例:在推送前运行 pre-push 钩子,检查所有单元测试和集成测试是否通过。

  9. pre-rebase.sample:

    • git rebase 开始前触发。可以用于检查 rebase 是否安全。

    • 使用场景:在开始 rebase 操作前,检查 rebase 是否安全。例如,确保当前分支没有未解决的冲突。

    • 示例:在 rebase 前,检查当前分支是否有未提交的更改,防止数据丢失。

  10. pre-receive.sample:

    • 在服务器端接收到推送数据前触发。常用于访问控制和验证推送内容。

    • 使用场景:在服务器端接收到推送数据前,进行访问控制和验证。例如,确保推送的代码符合公司的代码质量标准。

    • 示例:在接收推送前,运行代码质量检查工具,拒绝不符合标准的推送。

  11. prepare-commit-msg.sample:

    • git commit 创建提交消息前触发。可以用于预填充提交消息模板或修改提交消息。

    • 使用场景:在创建提交消息前,预填充提交消息模板或添加额外信息。例如,自动在提交消息中添加当前分支名称。

    • 示例:在创建提交消息前,自动添加 JIRA 任务号作为提交消息的前缀。

  12. push-to-checkout.sample:

    • 在服务器端 git push 更新工作目录后触发。主要用于部署环境。

    • 使用场景:在服务器端仓库更新工作目录后,触发自动化部署或其他操作。例如,在推送后自动部署新版本的应用。

    • 示例:在推送到服务器后,自动执行 git checkoutdocker-compose up,部署新版本。

  13. sendemail-validate.sample:

    • git send-email 发送邮件前触发。可以用于验证邮件内容或收件人。

    • 使用场景:在发送邮件前,验证邮件内容和收件人。例如,确保发送的邮件没有敏感信息。

    • 示例:在发送邮件前,检查邮件内容是否包含敏感信息,并验证收件人列表。

  14. update.sample:

    • 在服务器端 git push 更新引用(如分支、标签)前触发。用于验证推送的引用更新。

    • 使用场景:在服务器端更新引用(如分支、标签)前,进行验证。例如,确保只有特定用户可以更新 master 分支。

    • 示例:在更新分支前,检查用户权限,防止未经授权的推送。

如何使用这些钩子

要使用这些钩子,你需要将相应的 .sample 文件重命名并去掉 .sample 后缀,然后根据需要编辑脚本内容。例如:

然后编辑 pre-commit 文件,添加你的自定义逻辑。确保该文件是可执行的:

这样,当你执行 git commit 时,Git 会在提交前自动调用 pre-commit 钩子。

希望这些解释能帮助你更好地理解和使用 Git 钩子!

好的,理解不同 Git 钩子的触发时机和顺序对于有效使用它们非常重要。下面我将提供一个流程图,展示主要钩子在不同 Git 操作中的触发顺序。

理解不同 Git 钩子的触发时机和顺序对于有效使用它们非常重要。下面我将提供一个流程图,展示主要钩子在不同 Git 操作中的触发顺序。

当然,可以为每个钩子的触发时机补充对应的 Git 命令操作。这样你就能更清楚地知道在执行哪些命令时,哪些钩子会被触发。

提交(Commit)流程

  1. pre-commit

    • 触发时机:在提交创建前。

    • 对应命令git commit

  2. prepare-commit-msg

    • 触发时机:在编辑提交消息前。

    • 对应命令git commit

  3. commit-msg

    • 触发时机:在提交消息编辑完成后。

    • 对应命令git commit

  4. post-commit

    • 触发时机:在提交完成后。

    • 对应命令git commit

合并(Merge)流程

  1. pre-merge-commit

    • 触发时机:在合并提交创建前。

    • 对应命令git merge

  2. post-merge

    • 触发时机:在合并完成后。

    • 对应命令git merge

补丁应用(Apply Patch)流程

  1. pre-applypatch

    • 触发时机:在 git am 应用补丁前。

    • 对应命令git am

  2. applypatch-msg

    • 触发时机:在编辑补丁的提交消息前。

    • 对应命令git am

  3. post-applypatch

    • 触发时机:在补丁应用完成后。

    • 对应命令git am

推送(Push)流程

  1. pre-push

    • 触发时机:在推送到远程仓库前。

    • 对应命令git push

  2. pre-receive(远程仓库):

    • 触发时机:在接收到推送数据前。

    • 对应命令git push

  3. update(远程仓库):

    • 触发时机:在更新引用(分支、标签)前。

    • 对应命令git push

  4. post-receive(远程仓库):

    • 触发时机:在推送数据处理完成后。

    • 对应命令git push

  5. post-update(远程仓库):

    • 触发时机:在更新引用完成后。

    • 对应命令git push

变基(Rebase)流程

  1. pre-rebase

    • 触发时机:在开始 rebase 操作前。

    • 对应命令git rebase

  2. post-rewrite

    • 触发时机:在 rebase 操作完成后。

    • 对应命令git rebase

发送邮件(Send Email)流程

  1. sendemail-validate

    • 触发时机:在发送邮件前。

    • 对应命令git send-email

服务器端的钩子

接收推送(Receive Push)

  1. pre-receive

    • 触发时机:在接收到推送数据前。

    • 对应命令git push

  2. update

    • 触发时机:在更新引用(分支、标签)前。

    • 对应命令git push

  3. post-receive

    • 触发时机:在推送数据处理完成后。

    • 对应命令git push

  4. post-update

    • 触发时机:在更新引用完成后。

    • 对应命令git push

通过这个详细的对应表,你可以更清楚地知道在执行哪些 Git 命令时,哪些钩子会被触发,从而更好地设计和使用这些钩子来满足你的需求。

完整流程图

通过这个流程图,你可以更清晰地了解每个钩子在不同操作中的触发顺序和时机。希望这能帮助你更好地理解和使用 Git 钩子。

 

Git 三个分区

  1. 工作目录

  2. 索引 index

  3. git repo

 

 

常用git命令

  1. 配置 user.name 和 user.email

  2. 显示已有配置信息

  3. git cat-file

  4. 修改commit message

  5. 文件比较

  6. 恢复

  7. 临时任务

  8. 备份(几乎用不到),支持多点备份s1,s2,s3

  9. 分支信息

  10. 合并分支

  11. 删除分支

  12. 压缩

  13. 解压

  14. 垃圾清理

  15. 查看索引区文件

  16. 增加标签

  17. 删除标签

  18. git 维护

  19. git reflog

  20. git 历史删除文件

     

  21. git

  22.  

     

 

 

GitHub 工作流 (Fork+PR)

 

 

 

 

 

 

参考链接

  1. 这才是真正的GIT https://www.lzane.com/slide/git-under-the-hood

  2. 图解Git https://marklodato.github.io/visual-git-guide/index-zh-cn.html

  3. Git基本原理介绍 https://space.bilibili.com/364122352/channel/collectiondetail?sid=290009

  4. 极客时间玩转Git三剑客

  5. Github工作流 https://www.bilibili.com/video/BV19e4y1q7JJ

  6. LearnGitBranching Game https://github.com/pcottle/learnGitBranching

  7. Oh my git game https://github.com/git-learning-game/oh-my-git

  8. Git-tips https://github.com/jaywcjlove/git-tips

  9. 有关 git 的学习资料 https://github.com/xirong/my-git