progit笔记:自定义Git

本文详细介绍了Git的配置,包括系统级、用户级和仓库级的配置文件,以及客户端和服务器端的基本设置。讲解了如何修改默认编辑器、设置提交模板、选择分页器、管理GPG签署密钥和忽略文件。此外,还涉及Windows与Linux换行符处理、空白字符的格式化以及Git属性的使用,如关键字展开和过滤器。最后,提到了Git钩子的种类及其在客户端和服务器端的应用,强调了它们在工作流中的重要角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

progit笔记:自定义Git

配置Git

/etc/gitconfig 系统级,传递 --system 选项给 git config,它就会读写该文件。

~/.gitconfig 用户级,传递 --global 选项让 Git 读写该文件。

.git/config 仓库Git目录下,向 git config 传递 --local 选项。

客户端基本配置

可以通过 git config --list 查看当前配置

core.editor

# 修改默认的编辑器
$ git config --global core.editor emacs

commit.template

# 将 .gitmessage.txt 作为运行 git commit 时显示在你的编辑器中的默认信息
$ git config --global commit.template ~/.gitmessage.txt

core.pager

# 指定 log 和 diff 等命令所使用的分页器,设置成空字符串,关闭该选项:
$ git config --global core.pager ''

user.signingkey

# GPG 签署密钥设置为配置项
$ git config --global user.signingkey <gpg-key-id>

core.excludesfile

# 在所有的版本库中忽略掉某一类文件,.gitignore_global类似于全局生效的 .gitignore 文件
$ git config --global core.excludesfile ~/.gitignore_global

格式化与多余的空白字符

Windows 使用回车(CR)和换行(LF)两个字符来结束一行,而 macOS 和 Linux 只使用换行(LF)一个字符。

core.autocrlf

# Windows 系统上,检出代码时,换行会被转换成回车和换行:
$ git config --global core.autocrlf true
# Linux 或 macOS,检出代码时,把 core.autocrlf 设置成input 来告诉 Git 在提交时把回车和换行转换成换行,检出时不转换:
$ git config --global core.autocrlf input
# 开发仅运行在 Windows 上的项目,可以设置 false 取消此功能,把回车保留在版本库中:
$ git config --global core.autocrlf false

core.whitespace

默认被打开的三个选项是:blank-at-eol,查找行尾的空格;blank-at-eof,盯住文件底部的空行;space-before-tab,警惕行头 tab 前面的空格。

默认被关闭的三个选项是:indent-with-non-tab,揪出以空格而非 tab 开头的行(你可以用 tabwidth 选项控制它);tab-in-indent,监视在行头表示缩进的 tab;cr-at-eol,告诉 Git 忽略行尾的回车。

如果正准备应用的补丁存有特定的空白问题

# 让 Git 在应用补丁时发出警告:
$ git apply --whitespace=warn <patch>
# 让 Git 在打上补丁前自动修正此问题:
$ git apply --whitespace=fix <patch>

服务器端配置

receive.fsckObjects

# 设置 receive.fsckObjects 为 true 来强迫Git 会在每次推送生效前检查库的完整性
$ git config --system receive.fsckObjects true

receive.denyNonFastForwards

# 禁用强制更新推送(force-pushes):push 命令后加 -f 标志
$ git config --system receive.denyNonFastForwards true

receive.denyDeletes

有一些方法可以绕过 denyNonFastForwards 策略。其中一种是先删除某个分支,再连同新的引用一起推送回 该分支。

# 把 receive.denyDeletes 设置为 true 可以把这个漏洞补上:
$ git config --system receive.denyDeletes true

Git属性

可以针对特定的路径配置某些设置项,这样 Git 就只对特定的子目录或子文件集运用它们。 这些基于路径 的设置项被称为 Git 属性,可以在你的目录下的 .gitattributes 文件内进行设置(通常是你的项目的根目录)。

关键字展开

Git 属性提供了另一种方法:我们可以编写自己的过滤器来实现文件提交或检出时的关键字替换。
“smudge”过滤器会在文件被检出时触发
请添加图片描述

“clean”过滤器会在文件被暂存时触发
请添加图片描述

# .gitattributes 添加过滤器
date*.txt filter=dater

expand_date 过滤器脚本

#! /usr/bin/env ruby
data = STDIN.read
last_date = `git log --pretty=format:![请添加图片描述](https://img-blog.csdnimg.cn/ddbf4e5046f6471fb0f9e815a9882c8f.png)
"%ad" -1`
puts data.gsub('$Date$', '$Date: ' + last_date.to_s + '$')

设置检出和暂存过滤器,检出时调用expand_date 完成smudge操作,暂存文件时perl表达式完成clean操作

$ git config filter.dater.smudge expand_date
$ git config filter.dater.clean 'perl -pe
"s/\\\$Date[^\\\$]*\\\$/\\\$Date\\\$/"'

测试

$ echo '# $Date$' > date_test.txt

提交该文件,并再次检出,你会发现关键字如期被替换了:

$ git add date_test.txt .gitattributes
$ git commit -m "Testing date expansion in Git"
$ rm date_test.txt
$ git checkout date_test.txt
$ cat date_test.txt
# $Date: Tue Apr 21 07:26:52 2009 -0700$

注意:.gitattributes 文件会随着项目一起提交,而过滤器 (例如这里的 dater)不会,所以过滤器有可能会失效。

Git钩子

钩子都被存储在 Git 目录下的 hooks 子目录中。 也即绝大部分项目中的 .git/hooks

客户端钩子

  1. 提交工作流钩子

    • pre-commit
    • prepare-commit-msg
    • commit-msg
    • post-commit
  2. 电子邮件工作流钩子

    • applypatch-msg
    • pre-applypatch
    • post-applypatch
  3. 其它客户端钩子

    • pre-rebase
    • post-rewrite
    • post-checkout
    • post-merge
    • pre-push

服务器端钩子

  • pre-receive

  • update

  • post-receive

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值