如何将共同作者添加到最新推送的 git 提交?

问题描述 投票:0回答:5

我需要在上次提交中添加共同作者,我尝试使用

git commit --amend --author="name <[email protected]>"
但将
--author
更改为
--co-authored-by
。我认为这将是一个很容易通过谷歌搜索的解决方案,但一切都只针对作者而不是共同作者。

git github git-commit git-amend
5个回答
26
投票

“共同作者”不是一个 git 概念。这是某些服务(包括 GitHub)使用的提交消息中的约定。因此,解决方案是使用

git commit --amend
编辑实际提交消息并在末尾添加一行:

Co-Authored-By: Name <[email protected]>

4
投票

对于命令行提交,我创建了一个 prepare-commit-msg 钩子,需要将其放置在

.git/hooks/
内部,并且应授予可执行权限。您可以使用
up/down
浏览列表,并使用
space
选择一位或多位作者。

用途:

git commit -m "Message"

注意:根据自己的方便修改

参考:https://gist.github.com/smartameer/6c529bae770adbdd39bf895153564a34

#!/bin/bash

function prompt_for_multiselect {

    # little helpers for terminal print control and key input
    GREEN='\033[00;32m'
    YELLOW='\033[00;33m'
    RESTORE='\033[0m'
    ESC=$( printf "\033")
    cursor_blink_on()   { printf "$ESC[?25h"; }
    cursor_blink_off()  { printf "$ESC[?25l"; }
    cursor_to()         { printf "$ESC[$1;${2:-1}H"; }
    print_inactive()    { printf "$2   $1 $RESTORE"; }
    print_active()      { printf "$YELLOW$2  $ESC[7m $1 $RESTORE$ESC[27m"; }
    get_cursor_row()    { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${ROW#*[}; }
    key_input()         {
        local key
        IFS= read -rsn1 key 2>/dev/null >&2
        if [[ $key = ""      ]]; then echo enter; fi;
            if [[ $key = $'\x20' ]]; then echo space; fi;
                if [[ $key = $'\x1b' ]]; then
                    read -rsn2 key
                    if [[ $key = [A ]]; then echo up;    fi;
                        if [[ $key = [B ]]; then echo down;  fi;
                fi
            }
        toggle_option()    {
            local arr_name=$1
            eval "local arr=(\"\${${arr_name}[@]}\")"
            local option=$2
            if [[ ${arr[option]} == true ]]; then
                arr[option]=
            else
                arr[option]=true
            fi
            eval $arr_name='("${arr[@]}")'
        }

    local retval=$1
    local options
    local defaults

    IFS=';' read -r -a options <<< "$2"
    if [[ -z $3 ]]; then
        defaults=()
    else
        IFS=';' read -r -a defaults <<< "$3"
    fi
    local selected=()

    for ((i=0; i<${#options[@]}; i++)); do
        selected+=("${defaults[i]:-false}")
        printf "\n"
    done

    # determine current screen position for overwriting the options
    local lastrow=`get_cursor_row`
    local startrow=$(($lastrow - ${#options[@]}))

    # ensure cursor and input echoing back on upon a ctrl+c during read -s
    trap "cursor_blink_on; stty echo; printf '\n'; exit" 2
    cursor_blink_off

    local active=0
    while true; do
        # print options by overwriting the last lines
        local idx=0
        for option in "${options[@]}"; do
            local prefix="$RESET ◻︎"
            if [[ ${selected[idx]} == true ]]; then
                prefix="$GREEN ◼︎"
            fi

            cursor_to $(($startrow + $idx))
            if [ $idx -eq $active ]; then
                print_active "$option" "$prefix"
            else
                print_inactive "$option" "$prefix"
            fi
            ((idx++))
        done

        # user key control
        case `key_input` in
            space)  toggle_option selected $active;;
            enter)  break;;
            up)     ((active--));
                if [ $active -lt 0 ]; then active=$((${#options[@]} - 1)); fi;;
            down)   ((active++));
                if [ $active -ge ${#options[@]} ]; then active=0; fi;;
        esac
    done

    # cursor position back to normal
    cursor_to $lastrow
    printf "\n"
    cursor_blink_on

    eval $retval='("${selected[@]}")'
}

exec < /dev/tty

echo 'Please select from the authors list:'
AUTHORS=$(git shortlog -sce | cut -c8-)
AUTHORS_LIST=()

while read -r line; do
    if ! [[ "$line" =~ ^.*\|.*$ ]]; then
        AUTHORS_LIST+=("${line}")
        OPTIONS_STRING+="${line};"
    fi
done <<< "$AUTHORS"

prompt_for_multiselect SELECTED "$OPTIONS_STRING"
MESSAGE="\n\n"

for i in "${!SELECTED[@]}"; do
    if [ "${SELECTED[$i]}" == "true" ]; then
        MESSAGE="${MESSAGE}Co-authored-by: ${AUTHORS_LIST[$i]}\n"
    fi
done

exec <&-

sed -i.bak -e "1s/$/$MESSAGE/" $1


3
投票

窃取/挪用另一个问题的答案:

git commit --amend -m"$(git log --format=%B -n1)" -m"Co-authored-by: Anon"
使用 Bash 进行测试。

替代使用

git-interpret-trailers

git commit --amend -m"$(git log --format=%B -n1 | git interpret-trailers --trailer 'Co-authored-by: Anon')"
    

0
投票
可以这样做,但我会小心你在何时何地这样做。本质上,不要在主分支或任何共享分支中执行此操作。它将破坏待处理的 PR,并迫使其他人重置遥控器。

如果您所在的功能分支尚未合并到共享分支,则以下操作将起作用:


在您的本地存储库中,确保其是最新的:

git fetch --all git pull
然后启动交互式变基,并使用 HEAD~N 指定要编辑的提交距离多远,在您的情况下,使用 HEAD~1 定位最新的提交:

git rebase -i HEAD~1
然后通过以下方式将消息更改为您想要的内容:

git commit --amend -m
在您的情况下,要添加共同作者,请在标题之间添加一些空格,然后添加

Co-authored By: Name <[email protected]>
您应该能够通过 

git log

 看到更改。如果您满意,可以推动更改:

git push --force-with-lease {remote} {branch}

--force-with-lease

 是必需的,因为提交历史记录已更改。否则你的推送将会失败。


0
投票
您可以使用

此 Git 别名 在单个命令中将自己添加为最近提交的共同作者:

co-author = !git commit --amend --message=\"$(git show --format=%B --no-patch HEAD)\" --message=\"$(printf 'Co-Authored-By: %s <%s>' \"$(git config --get user.name)\" \"$(git config --get user.email)\")\"
只需运行

git co-author

,最后一次提交就应该被更新。

© www.soinside.com 2019 - 2024. All rights reserved.