【问题标题】:How to automaticaly add global config variable in commit messge?如何在提交消息中自动添加全局配置变量?
【发布时间】:2022-01-04 19:47:05
【问题描述】:

我想在提交消息中自动添加我的团队名称,我已使用以下命令在全局配置中注册:

git config --global user.team "Seawolves"

有许多团队在同一个项目中工作,我们共享一个在 gitconfig 文件中指定的模板文件。

[commit]
  template =  /mnt/share/gitmessage

这是我的 ~/.gitconfig 的一部分:

cat ~/.gitconfig 
[user]
    name = Rajesh Khanna
    email = rajesh.khanna@somthing.com
    team = Seawolves

从 ~/.gitconfig 获取团队名称并将 git 放入提交消息的最佳方法是什么?我应该使用 prepare-commit-msg 钩子吗?或者它是一种更简单的方式来获取消息,就像它为电子邮件和姓名自动完成的那样?

或者我需要使用以下命令获取它吗:git config user.team

然后将其回显到类似于我在此处找到的消息中: https://gist.github.com/bartoszmajsak/1396344/97081e76ab275f5fe526347908503febd1340495

【问题讨论】:

    标签: git automation pre-commit-hook


    【解决方案1】:

    处理这个问题的最好方法确实是使用prepare-commit-msg 钩子。当你创建一个时,你应该注意传递给它的参数,除非你想让你的生活变得不必要的困难,否则当你使用 git commit --amend 时避免修改它(例如当第二个参数是 commit )。

    请注意,钩子需要修改作为第一个参数的文件,这与许多人的期望不同。因此,您通常希望在 Perl、Ruby 或 sed 中使用类似 -i 的参数,或者在 w 命令中使用像 ed -sex -s 这样的脚本行编辑器。

    如果您尝试添加预告片,那么git interpret-trailers 可能有助于根据配置添加您想要的条目,并且您可以自定义它以不添加已经存在的条目。它不能使用user.team,但它可以使用其他配置选项来设置预告片。

    您尝试简单地将模板中的 %(team) 标记替换为 user.team 的值的示例如下所示:

    #!/bin/sh
    
    file="$1"
    from="$2"
    
    [ "$from" = commit ] && exit 0
    
    TEAM=$(git config user.team) perl -i -e 's/\%\(team\)/$ENV{TEAM}/g' "$file"
    

    这会将配置值提取到传递给 Perl 的 TEAM 环境变量中,然后将 %(team) 替换为该环境变量的值。您也可以使用 sed 执行此操作,但您必须确保您的 user.team 值不包含斜杠(或您使用的任何其他分隔符):

    sed -i -e "s/%(team)/$(git config user.team)/g"
    

    请注意,此构造适用于 GNU sed; BSD sed 和 macOS 一样,在使用 -i 时需要一个额外的参数。由于它不可移植,因此您应该避免使用这种语法并改用 Perl 或 Ruby,除非您确定它只会在单个操作系统上使用。

    【讨论】:

    • 谢谢,我该如何写才能使用 sed 而不是 perl?您能否更详细地解释最后一行会发生什么?
    • 我已经在上面解释了这一点以及如何使用sed,以及为什么,虽然您可以使用sed,但它并不便携。
    猜你喜欢
    • 2022-06-16
    • 2012-11-30
    • 2015-12-04
    • 2012-01-27
    • 2014-11-07
    • 2017-05-16
    • 1970-01-01
    • 2016-05-02
    • 2016-04-16
    相关资源
    最近更新 更多