如何将合著者添加到最新推送的 git 提交?
How do I add a co-author to latest pushed git commit?
我需要在上次提交中添加合著者,我尝试使用 git commit --amend --author="name <name@email.com>"
但将 --author
更改为 --co-authored-by
。我认为这将是一个容易 google 的修复,但一切仅供作者而非合著者使用。
"Co-author" 不是 git 概念。这是一些服务使用的提交消息中的约定,包括 GitHub。因此,解决方案是使用 git commit --amend
编辑实际提交消息并在末尾添加一行:
Co-Authored-By: Name <name@email.com>
对于命令行提交,我创建了一个 prepare-commit-msg 挂钩,需要将其放置在 .git/hooks/
内并且应该被授予可执行权限。您可以使用 up/down
导航列表,并使用 space
导航至 select 一位或多位作者。
用法: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='3[00;32m'
YELLOW='3[00;33m'
RESTORE='3[0m'
ESC=$( printf "3")
cursor_blink_on() { printf "$ESC[?25h"; }
cursor_blink_off() { printf "$ESC[?25l"; }
cursor_to() { printf "$ESC[;${2:-1}H"; }
print_inactive() { printf " $RESTORE"; }
print_active() { printf "$YELLOW $ESC[7m $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=
eval "local arr=(\"${${arr_name}[@]}\")"
local option=
if [[ ${arr[option]} == true ]]; then
arr[option]=
else
arr[option]=true
fi
eval $arr_name='("${arr[@]}")'
}
local retval=
local options
local defaults
IFS=';' read -r -a options <<< ""
if [[ -z ]]; then
defaults=()
else
IFS=';' read -r -a defaults <<< ""
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/"
我需要在上次提交中添加合著者,我尝试使用 git commit --amend --author="name <name@email.com>"
但将 --author
更改为 --co-authored-by
。我认为这将是一个容易 google 的修复,但一切仅供作者而非合著者使用。
"Co-author" 不是 git 概念。这是一些服务使用的提交消息中的约定,包括 GitHub。因此,解决方案是使用 git commit --amend
编辑实际提交消息并在末尾添加一行:
Co-Authored-By: Name <name@email.com>
对于命令行提交,我创建了一个 prepare-commit-msg 挂钩,需要将其放置在 .git/hooks/
内并且应该被授予可执行权限。您可以使用 up/down
导航列表,并使用 space
导航至 select 一位或多位作者。
用法: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='3[00;32m'
YELLOW='3[00;33m'
RESTORE='3[0m'
ESC=$( printf "3")
cursor_blink_on() { printf "$ESC[?25h"; }
cursor_blink_off() { printf "$ESC[?25l"; }
cursor_to() { printf "$ESC[;${2:-1}H"; }
print_inactive() { printf " $RESTORE"; }
print_active() { printf "$YELLOW $ESC[7m $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=
eval "local arr=(\"${${arr_name}[@]}\")"
local option=
if [[ ${arr[option]} == true ]]; then
arr[option]=
else
arr[option]=true
fi
eval $arr_name='("${arr[@]}")'
}
local retval=
local options
local defaults
IFS=';' read -r -a options <<< ""
if [[ -z ]]; then
defaults=()
else
IFS=';' read -r -a defaults <<< ""
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/"