裸存储库上的Git mailmap

时间:2013-02-13 19:51:34

标签: git git-bare

我在我的git存储库中设置了一个.mailmap文件,现在正在运行

git log --format="%aE"
我的本地仓库中的

正确映射.mailmap文件中指定的所有电子邮件地址。但在我推送到我的裸仓库并在服务器上运行相同的命令后,输出不变(忽略.mailmap文件)。我确定这是因为裸存储库没有工作树,因此log命令看不到.mailmap文件。是否有一些棘手的方法可以让它发挥作用?

我能想到的笨重的方法就是:

git show master:.mailmap

然后应用某种查找和替换操作。这是最好的选择吗?

2 个答案:

答案 0 :(得分:1)

在托管裸存储库的地方,你有哪个版本的git?查看git源代码,您的案例应该已经由commit处理,包含在v1.8.2中。

答案 1 :(得分:0)

.mailmap 被记录为只能从工作树的根级别读取,但也意外读取了裸存储库中的杂散文件,这已在 Git 2.31(2021 年第一季度)中得到纠正。

请参阅 commit a38cb98Jeff King (peff)(2021 年 2 月 10 日)。
(2021 年 2 月 17 日在 Junio C Hamano -- gitster --commit 9bdccbc 合并)

<块引用>

mailmap:只在工作树中寻找.mailmap

签字人:Jeff King

<块引用>

在尝试查找 .mailmap 文件时,我们将始终在当前目录中查找它。
这在具有工作树的存储库中是有意义的,因为我们总是在启动时转到顶级目录。

但对于一个裸仓库来说,这可能会令人困惑。

使用 --git-dir 之类的选项(或环境中的 $GIT_DIR),我们根本不chdir,我们会从您的任何目录中读取 .mailmap碰巧是在启动 Git 之前。

(注意 --git-dir 过去没有指定工作树意味着当前目录是工作树的根目录,但现在大多数裸仓库都会设置 core.bare,这意味着他们会意识到根本没有工作树)。

gitmailmap(5) 的文档说:

If the file `.mailmap` exists at the toplevel of the repository[...]

这同样强化了我们正在查看工作树的概念。

这个补丁阻止我们在裸仓库中寻找这样的文件。
这确实打破了过去的工作:

cd bare.git
git cat-file blob HEAD:.mailmap >.mailmap
git shortlog

但这从未在文档中做广告。
现在我们有 mailmap.blob(默认为 HEAD:.mailmap)以更简洁的方式做同样的事情。

然而,还有一个更有趣的案例:我们可能根本没有存储库! git-shortlog(man) 命令可以在 git-log 输出到其标准输入的情况下运行,它将应用邮件映射。
在这种情况下,从当前目录读取 .mailmap 可能确实有意义。
此补丁将继续这样做。

这导致了一种更奇怪的情况:如果您运行 git-shortlog 来处理 stdin,则输入可能完全来自不同的存储库。
那么我们应该尊重 in-tree .mailmap 吗?可能是的。
无论输入的来源是什么,如果 shortlog 在存储库中运行,文档声称我们会从其顶级读取 .mailmap(当然,它很可能 来自同一个 repo,并且用户只是喜欢出于任何原因分别运行 git-log(man)git-shortlog)。

包含的测试涵盖了这些情况,我们现在明确记录“无回购”情况。

我们还添加了一个测试,即使我们从工作树的子目录开始,也能确认我们找到了顶级“.mailmap”。
这在提交之前和之后都有效,但我们从未明确测试过它(它有效是因为我们总是 chdir 到工作树的顶层(如果有的话))。

git shortlog 现在包含在其 man page 中:

<块引用>

请注意,如果 git shortlog 在存储库之外运行(以处理 在标准输入上记录内容),它将在其中查找 .mailmap 文件 当前目录。