如何找出 Git 仓库中可能过时的文件
使用场景
在维护 Git 仓库,特别是文档类型的仓库,随着文档数量的增加,很容易出现信息不准确或过时的情况。为了解决这个问题,你可以将文档的内容与对应功能的代码或存在的 issue 绑定,当上游代码发生变化时,自动触发文档的更新。这种方式适合文档项目从 0 到 1 的初期,但是对于已经存在的文档项目重新维护这样的绑定关系就会变得很麻烦。
为了及时发现文档仓库中可能过时的内容,你可以使用 git log
命令获取文档的最后一次更新信息,以发现长期未更新的文档。下面具体介绍如何使用 git log
生成指定目录下所有 Markdown 文件的最后一次 commit 信息。
使用方法
如果在 macOS 上使用该脚本,需要先安装 gnu-sed
和 findutils
:
brew install gnu-sed findutils
-
获取需要使用的脚本
generate_last_commit_report.sh
:- Command
- Shell script
git clone https://gist.github.com/862f24cec9a5915c71019dea2795c423.git scripts
chmod +x scripts/generate_last_commit_report.shgenerate_last_commit_report.sh#!/bin/bash
set -e
DIR=$1
REPO=$2
FIND=$(which gfind || which find)
SED=$(which gsed || which sed)
(
echo '| File | Last Commit Author | Last Commit Date | Relative Date |'
echo '| ---- | ------------------ | ---------------- | ------------- |'
(
cd "$DIR"
$FIND . -name '*.md' | $SED 's~^./~~' | while read -r FILE; do
git --no-pager log -1 --format=format:'%at | '"[$FILE](https://github.com/$REPO/blob/%H/$FILE)"' | %an | %as | %ar |%n' "$FILE"
done
) | sort --numeric-sort | $SED -E 's~^[0-9]+ ~~'
) >"$DIR"_commit_log.md -
获取某个文档仓库、某个分支的最新内容:
git clone https://github.com/{OWNER}/{REPO}.git {DOC_REPO}
cd {DOC_REPO}
git checkout {BRANCH} -
运行
generate_last_commit_report.sh
脚本生成报告,其中第一个参数{DOC_REPO}
为要生成报告的文件路径,第二个参数{OWNER}/{REPO}
为文档仓库的 GitHub 地址:./scripts/generate_last_commit_report.sh {DOC_REPO} {OWNER}/{REPO}
源码解读
下面以 pingcap/docs 为例介绍如何一步步写出这个脚本。
git clone https://github.com/pingcap/docs.git docs
cd docs
1. 获取一个文件的最后一次 commit
-
要获取一个文件的所有 commit log,你可以使用
git log
命令。下面以_index.md
文件为例:- Command
- Output
git log _index.md
commit b364250639205bd054ada454749a0dc8df04d811
Author: TomShawn <41534398[email protected]>
Date: Mon Feb 20 18:35:06 2023 +0800
add 6.6.0 release notes (#12321)
commit c97100c4832287dd970c10eb5ca43a8a3fcc1a35
Author: xixirangrang <[email protected]>
Date: Mon Jan 30 14:01:54 2023 +0800
Update _index.md (#12270)
commit 8cf82718ba95b00b02beb2ef0786421826545fa7
Author: Ran <[email protected]>
Date: Thu Dec 1 11:58:00 2022 +0800
*: add annotations for l10n (#11468)
commit d45bb4b2d39d7e7da68bd3f2cedfa98fe41f4a61
Author: xixirangrang <[email protected]>
Date: Wed Nov 30 10:48:00 2022 +0800
*: change NewSQL to distributed SQL (#11463)
: -
获取指定文件的最后一次 commit 信息:
要限制 commit logs 的数量,可以使用
-<number>
,-n <number>
,--max-count=<number>
选项:- Command
- Output
git log -1 _index.md
commit b364250639205bd054ada454749a0dc8df04d811
Author: TomShawn <41534398[email protected]>
Date: Mon Feb 20 18:35:06 2023 +0800
add 6.6.0 release notes (#12321) -
自定义最后一次 commit 信息的内容:
如果需要自定义 commit 信息的内容,可以使用
--format=format:<string>
选项。更多使用方法,可参考 pretty formats。下面示例的自定义格式为:最后一次 commit 的 UNIX 时间,commit 哈希值,最后一次 commit 作者名称,最后一次 commit 的 YYYY-MM-DD 格式时间,最后一次 commit 的相对时间:
- Command
- Output
git log -1 --format=format:"%at,%H,%an,%as,%ar%n" _index.md
1676889306,b364250639205bd054ada454749a0dc8df04d811,TomShawn,2023-02-20,9 days ago
-
使用
-P
,-no-pager
选项不分页输出自定义的 commit 信息:git --no-pager log -1 --format=format:"%at,%H,%an,%as,%ar%n" _index.md