我在我的git存储库中设置了一个.mailmap文件,现在正在运行
git log --format="%aE"
我的本地仓库中的正确映射.mailmap文件中指定的所有电子邮件地址。但在我推送到我的裸仓库并在服务器上运行相同的命令后,输出不变(忽略.mailmap文件)。我确定这是因为裸存储库没有工作树,因此log命令看不到.mailmap文件。是否有一些棘手的方法可以让它发挥作用?
我能想到的笨重的方法就是:
git show master:.mailmap
然后应用某种查找和替换操作。这是最好的选择吗?
答案 0 :(得分:1)
在托管裸存储库的地方,你有哪个版本的git?查看git源代码,您的案例应该已经由commit处理,包含在v1.8.2中。
答案 1 :(得分:0)
.mailmap
被记录为只能从工作树的根级别读取,但也意外读取了裸存储库中的杂散文件,这已在 Git 2.31(2021 年第一季度)中得到纠正。
请参阅 commit a38cb98 的 Jeff 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
文件
当前目录。