说明
本篇根据原书第二章前半部分的学习笔记整理,涉及 2.1 ~ 2.4 小节内容。具体实操代码库,需使用 GitHub 线上版本。
第二章 配置 Git
相关主题:
- 配置目标
- 检索已有配置
- 配置模板
.git
目录模板- 几个配置示例
- 设置 Git 别名
refspec
举例
2.1 配置目标
Git 配置分三个层次:
配置层次说明配置文件路径
SYSTEM
系统级配置Linux:
/etc/gitconfig
Windows:
C:\Git\etc\gitconfig
GLOBAL
用户级配置
~/.gitconfig
LOCAL
仓库级配置
.git/config
练习:
# Sync repo status
$ git clone https://git.eclipse.org/r/jgit/jgit demo
$ cd demo
# List the system config
$ git config --list--system# List the global (user) config
$ git config --list--global# List the repo config
$ git config --list--local# Query single global key
$ git config --global user.email
# Set a key locally
$ git config --local user.email [email protected]
# Set default git editor
$ git config --global core.editor vim
2.2 检索已有配置
# View all the effective configurations for the current Git repository
$ git config --list# Show single configuration item
$ git config user.name
# Set a new username
$ git config user.name "John Doe"# Set your own configuration
$ git config my.own.config "Whatever I need"
$ git config my.his.config "Whatever He need"
$ git config my.own.config.item item
# Check the config file
$ cat .git/config
# ... sth irrelevant[my "own"]
config = Whatever I need
[my "his"]
config = Whatever He need
[my "own.config"]
item = item
# Show the value assigned
$ git config my.own.config
Whatever I need
$ git config my.own.config.item
item
2.3 配置模板
模板通常在用户级配置(
GLOBAL
),一般不在仓库级(
LOCAL
)配置。
# Demonstrated in Windows
> git clone https://github.com/PacktPublishing/Git-Version-Control-Cookbook-Second-Edition.git demo
> git demo
# Create template file, save as ~/gitcommitmsg.txt
> notepad
# Demo content:###########################################################
Short description of commit
Longer explanation of the motivation for the change
Fixes-Bug: Enter bug-id or delete line
Implements-Requirement: Enter requirement-id or delete line
############################################################ Config commit template
> git config --global commit.template ~/gitcommitmsg.txt
# Create a new commit
> echo"test new content" >> abc.txt
> git status -s
?? abc.txt
> git add abc.txt; git status
A abc.txt
> git commit
# This would display a Sublime Text 3 interface:
# Edit the template content, save and exit sublime text
> git commit
[master a5c36d0] Test git template file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 abc.txt
> git log -1
commit a5c36d0bb6bcd5e3599de500e7628c296554aa93 (HEAD -> master)
Author: SafeWinter <[email protected]>
Date: Sat Nov 27 23:30:16 2021 +0800
Test git template file
Added a new file called abc.txt to test the functionality of git template
Fixes-Bug: demo-bug-001
Implements-Requirement: (skip)
相关注意事项
- 配置
Sublime Text 3
为默认编辑器时,需加-w
参数,表示wait
,即等待提交内容保存完毕后才可退出编辑,否则会默认提交失败。相关的 Git 配置如下(Windows
环境下,路径分隔符 只能是\\
):
# List git default editor (Sublime Text 3)
$ git config --system core.editor
'C:\\ProgramFiles\\SublimeText3\\subl.exe'-w# Config Sublime Text 3 as default git editor
$ git config --system core.editor "'C:\\ProgramFiles\\SublimeText3\\subl.exe' -w"
Window
下的 Git 设置不可直接用于WSL2
,因为绝对路径在Linux
环境下不存在C:\
,而是挂载在/mnt/
路径下。- 虽然对 WSL2 可重新配置默认编辑器:
$ git config --system core.editor'/mnt/c/ProgramFiles/SublimeText3/subl.exe'-w
当在WSL2
但运行git commit
时,Sublime Text 3
会默认保存到Win10
环境下的.git
文件夹内,临时文件名为:.git/COMMIT_EDITMSG
;然而此时使用的路径还是 WSL2 的/mnt/c/...
,因此首次默认保存提交注释会出错,需要手动指定到当前.git
文件夹内,再次覆盖保存。 - 由于
Linux
和Windows
的根路径不同,要尽量避免同时在Windows
和Linux
环境内提交新版本,否则将报错:# Under WSL2 environment$ git commithint: Waiting for your editor to close the file... 'C:\\ProgramFiles\\SublimeText3\\subl.exe' -w: 1: C:\\ProgramFiles\\SublimeText3\\subl.exe: not founderror: There was a problem with the editor ''C:\\ProgramFiles\\SublimeText3\\subl.exe' -w'.Please supply the message using either -m or -F option.
- 模板注释文件也可以是仓库级别的,只要将文件配置在
--local
级别即可,以满足更多样化的模板设置。
2.4
.git
目录模板
除了全局配置,有时进行版本控制时还需要触发一些预处理脚本的执行(这些
script
脚本即
Git hooks
、Git 钩子),或者是模板化地剔除一些文件等。此时可以对
git init
命令设置统一的预处理操作。为配置项
init.templatedir
指定一个存放脚本的文件夹路径即可。
该文件夹路径的配置方式:
- 作为
git clone
、git init
命令的参数项运行; - 作为
$GIT_TEMPLATE_DIR
环境变量运行; - 作为 Git 的配置项运行(配置
init.templatedir
实现,默认路径为/usr/share/git-core/templates
)。
模板化操作的工作原理
将指定模板文件夹内的文件复制到
.git
(即
$GIT_DIR
)文件夹。
本节演示两个模板操作:
git hook
示例- 以模板的方式设置忽略清单,忽略所有
*.txt
文件加入版本控制
示例1:Git 钩子
# Make customed template directory
$ mkdir ~/.git_template
$ mkdir ~/.git_template/{hooks,info}# Copy git default hook files
$ cd ~/.git_template/hooks
$ cp /usr/share/git-core/templates/hooks/* .# Rename commit-msg.sample file
$ cp commit-msg.sample commit-msg
# Edit with vim in commit-msg:
# Make the hook executable
$ chmod +x ~/.git_template/hooks/commit-msg
# Config git template directory
$ git config --global init.templatedir ~/.git_template
# Testing and validating
$ cd ~ &&git init template-example &&cd template-example
$ echo"something to commit"> somefile
$ gitadd somefile
$ git commit -m"Committed something"
$ git log -1
可以看到,提交的内容后面有一空行,以及一行由
git hook
中的
commit-msg
指定的文本。
示例2:剔除
*.txt
文件
本例将设置忽略所有
*.txt
文件,相当于将
*.txt
加入
.gitignore
文件。
# Make a new exclude file into template folder
$ echo"*.txt"> ~/.git_template/info/exclude
# testing
$ cd ~ &&git init template-example2 &&cd template-example2
$ echo"this is the readme file"> README.txt
$ git status
小结
- 每当进行
init
或clone
操作,创建文件夹时 git 会自动将模板文件夹内的文件复制到新版本库.git
中。此外,模板路径还可以在 命令行 或 环境变量 中进行指定;- 示例中使用了
--global
,意味着对该用户的所有相关操作生效。但也有不足:对配置生效前同样需要应用相同模板规则的旧仓库,只能手动再执行一遍git init
;- 示例仅对 Linux 系统生效,Windows 系统的默认模板路径在
{GIT_INSTALL_DIR}\mingw64\share\git-core\templates
,且\n
在 Windows 系统不能输出一个回车,可以追加一个空串:($1
指代的是版本提交时的注释内容)#!/bin/shMSG_FILE="$1"echo"">>$MSG_FILEecho"Hi from template commit-msg hook on Win10">>$MSG_FILE
版权归原作者 安冬的码畜日常 所有, 如有侵权,请联系我们删除。