# git-action-hooks
**Repository Path**: zbjxb/git-action-hooks
## Basic Information
- **Project Name**: git-action-hooks
- **Description**: windows上针对git代码库设定hooks
- **Primary Language**: Python
- **License**: GPL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-12-09
- **Last Updated**: 2023-05-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 概述
这个脚本主要是以git钩子的形式,来完成一个特定的功能:检测一个unreal project下的插件是否有改动,若有,则更新这些(改动了的)插件的uplugin文件里的版本号字段。
目的就是追踪插件的版本号,这样从git代码库里任意一个commit签出一个版本给别人使用时,插件都是带有版本号的,使得我们能够追踪插件的出处。
这个追踪的原理,见https://my.oschina.net/zhoubaojing/blog/4321081
**2022.09.20更新:** 出于对C#工程中追踪版本号的需要,实现了一个通用的追踪版本号的功能,其使用方法在【使用】这一节会详细描述。
# 细节
插件出现了改动,是指插件目录(即uplugin文件所在的目录)及其子目录下有提交到staging区域的改动。目前识别了Add、Delete、Rename、Copy、Modify类型的改动。
## 版本号生成的规则
如果是一个刚创建的repository,尚未发生过提交,则版本号为**当前日期#0000000**,如Dec-09-2021#0000000。
如果repository里已有过commit,则新的版本号为**当前日期#最新的commit的HEXSHA前7位**,如Dec-09-2021#fd71103
注意[ff8442b](https://gitee.com/zbjxb/git-action-hooks/commit/ff8442bc39982d81c9884e66cf063ab81456964e)的修改,版本号规则修改为在上面描述的基础上追加6位十六进制随机数。原因在commit message里已解释。
install-pre-commit.bat用来安装hooks:就是简单的将pre-commit和pre-commit.py两个文件拷贝到.git/hooks/下。
pre-commit其实是一个bat文件,也可以认为是shell文件,里面就一句用python执行pre-commit.py。这个文件就是hooks,利用git程序commit代码时,这个pre-commit会在commit前执行。
pre-commit.py是真正的hooks逻辑。
# 使用
分两种使用场景来介绍:针对虚幻引擎的插件版本号追踪,以及针对其他通常的项目版本号追踪(简称为“其他情形”)。
**无论哪种情形,首先需要将包含common与ue-plugin-version文件夹的git-action-hooks文件夹拷贝到git库的根目录下,即与.git文件夹保持平级。**
## 虚幻引擎插件版本号追踪
### 安装钩子
执行一下git-action-hooks/ue-plugin-version/install-pre-commit.bat即可。
~~如果你定制了这个py脚本,记得再次运行install-pre-commit.bat重新安装钩子。~~ (已由[edc3e4a](https://gitee.com/zbjxb/git-action-hooks/commit/edc3e4a154afb154e12b170af8caf4ca6f7a832a)解决)
需要注意的地方还有,将UE4插件发给别人使用时,一定要严格遵守流程:只能从代码库里checkout某个commit版本发布出去,最好将要发布的版本打个tag,发布的东西一定都是某个tag版本,这样整个版本追踪的逻辑就工作的很顺利。不要随随便便将本地当前编译好的版本给出去,若如此便脱离了代码追踪的流程。见【概述】里描述的版本追踪原理。
以上用TortoiseGit测试功能正常。UE4编辑器工具栏Git选项提交时无法将uplugin文件写入,原因是UE4编辑器的git提交时,在git系统调用pre-commit钩子前,已经用index.lock锁定了staged area,我无法成功的将修改后的uplugin文件加入到staged area。
## 其他情形版本号追踪
### 安装钩子
执行一下git-action-hooks/common/install-pre-commit.bat即可。
### 创建配置文件
仿照git-action-hooks/common/config.template.json模板文件创建一个git-action-hooks/common/config.json文件。
```json
{
"version_files": [
{
"template": "git-action-hooks/common/C/version_file.h.template", // relative to [.git/../]
"placeholder": "##VERSION##",
"output": "git-action-hooks/common/C/version_file.h" // relative to [.git/../]
},
{
"template": "git-action-hooks/common/C#/version_file.cs.template",
"placeholder": "##VERSION##",
"output": "git-action-hooks/common/C#/version_file.cs"
}
]
}
```
`version_files`字段的值是一个json数组,该数组每个元素都是一个创建版本文件的动作。**通常只需持有一个动作即可**,即该json数组只保留一个元素。
当然,如果你确实需要同时产生多个版本号文件,则如json模板里所示,添加多个动作即可。
#### 动作
```json
{
"template": "git-action-hooks/common/C#/version_file.cs.template",
"placeholder": "##VERSION##",
"output": "git-action-hooks/common/C#/version_file.cs"
}
```
动作是用一个json object描述的。包含3个字段:`template`、`placeholder`、`output`。
`template`:指定一个版本号文件的模板,参照version_file.cs.template,这个模板可以视自己的实际情况编写。`template`指定的模板文件必须是相对于git库根目录的路径。
`placeholder`:指定**版本号占位符**。占位符**必须**出现在`template`指定的模板文件中,动作执行中会将版本号占位符替换为版本号。
`output`:指定输出版本号文件的路径。`output`指定的版本号文件必须是相对于git库根目录的路径。
动作的执行过程是:读取模板文件,将模板文件中的版本号占位符替换为正确的版本号,将替换后的完整内容输出为指定的版本号文件。
# 注意
- ~~[a717110](https://gitee.com/zbjxb/git-action-hooks/commit/a717110491ca2a2b5c5090133f97302f3fc396be)~~ 已由[ff8442b](https://gitee.com/zbjxb/git-action-hooks/commit/ff8442bc39982d81c9884e66cf063ab81456964e)解决
- 如果git提交时总是提示错误,检查一下电脑是否已安装python。装上python后,运行一下代码库里的install-pymodules-depends.bat批处理