使用漂亮格式字符串时在 git 日志中显示合并父项
Show merge parents in git log when using pretty format string
Git 日志 documentation 说:
If the commit is a merge, and if the pretty-format is not oneline, email or raw, an additional line is inserted before the Author: line. This line begins with "Merge: " and the sha1s of ancestral commits are printed, separated by spaces.
购买 我在我的 git 全局配置中使用 format.pretty,但我没有看到 "Merge line"。
我可以使用 git-log documentation:
中显示的 %p(或 %P)参数来模拟它
%P: parent hashes
%p: abbreviated parent hashes
但如果提交不是合并提交,则显示空 "Merge:" 行。
有没有办法在使用漂亮的格式字符串时模拟关于合并提交父项的标准日志行为?
很遗憾,不,目前无法执行此操作。问题是当且仅当这是合并提交时,您必须包含 %p
或 %P
,但没有 "test some condition, execute format directives based on result" 格式指令。 (我们得到的最接近的是 %<
、%>
等指令。)
有一种方法可以解决这个问题,但速度很慢:使用 git rev-list
获取所需的提交 ID,然后使用 git log -1
或 [=17= 一次记录一个].这样你就可以在调用 git log
之前 运行 任何你喜欢的代码,例如测试 "is this a merge commit"。如果是合并提交,则将所需的指令添加到格式中,如果不是,则将其保留。例如:
git rev-list HEAD | while read hash; do
if is-merge $hash; then fmt="... %p ..."; else fmt="... ..."; fi
git log --no-walk --format="$fmt" $hash
done
其中 is-merge
检查父项计数。 (为了更有效地做到这一点,使用 git rev-list --parents
并将 read
命令更改为 read hash parents
或 read hash parent1 rest
,之后您可以测试 $parents
或 $rest
。如果你在 bash 中写作,你可以使用数组。)
Git 日志 documentation 说:
If the commit is a merge, and if the pretty-format is not oneline, email or raw, an additional line is inserted before the Author: line. This line begins with "Merge: " and the sha1s of ancestral commits are printed, separated by spaces.
购买 我在我的 git 全局配置中使用 format.pretty,但我没有看到 "Merge line"。
我可以使用 git-log documentation:
中显示的 %p(或 %P)参数来模拟它%P: parent hashes
%p: abbreviated parent hashes
但如果提交不是合并提交,则显示空 "Merge:" 行。
有没有办法在使用漂亮的格式字符串时模拟关于合并提交父项的标准日志行为?
很遗憾,不,目前无法执行此操作。问题是当且仅当这是合并提交时,您必须包含 %p
或 %P
,但没有 "test some condition, execute format directives based on result" 格式指令。 (我们得到的最接近的是 %<
、%>
等指令。)
有一种方法可以解决这个问题,但速度很慢:使用 git rev-list
获取所需的提交 ID,然后使用 git log -1
或 [=17= 一次记录一个].这样你就可以在调用 git log
之前 运行 任何你喜欢的代码,例如测试 "is this a merge commit"。如果是合并提交,则将所需的指令添加到格式中,如果不是,则将其保留。例如:
git rev-list HEAD | while read hash; do
if is-merge $hash; then fmt="... %p ..."; else fmt="... ..."; fi
git log --no-walk --format="$fmt" $hash
done
其中 is-merge
检查父项计数。 (为了更有效地做到这一点,使用 git rev-list --parents
并将 read
命令更改为 read hash parents
或 read hash parent1 rest
,之后您可以测试 $parents
或 $rest
。如果你在 bash 中写作,你可以使用数组。)