4

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

git log --format="%aE"

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

我能想到的笨拙方式是运行:

git show master:.mailmap

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

4

2 回答 2

1

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

于 2013-04-10T12:40:03.113 回答
0

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

请参阅Jeff King ( ) 的提交 a38cb98(2021 年 2 月 10 日(由Junio C Hamano 合并——提交 9bdccbc中,2021 年 2 月 17 日)peff
gitster

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

签字人:杰夫·金

尝试查找.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)以更清洁的方式做同样的事情。

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

这导致了一种更奇怪的情况:如果您运行git-shortlog以处理标准输入,则输入可能完全来自不同的存储库。
那么我们应该尊重in-tree.mailmap吗?大概是。无论输入的来源是什么,如果shortlog
在存储库中运行,文档声称我们会从其.mailmap顶层读取无论出于何种原因单独运行man) 。git-loggit-shortlog

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

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

git shortlog现在在其手册页中包含:

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

于 2021-02-21T00:28:17.050 回答