大多数时候,我使用这些git
命令:
git add src/ package.json
git commit -m "custom message"
git push origin "name_of_the_branch"
所以我想创建一个单独的别名命令,它看起来像这样:
git_alias src/ package.json && "custom message" && name_of_the_branch
通过运行上述别名,它应该运行所有三个git
命令(add
,commit
和push
)。
我怎样才能做到这一点?
笔记
我知道我可以为任何命令(在本例中为git commit
)创建别名,如下所示:
alias gc='git commit -m '
答案1
在这种情况下,您需要创建一个函数。将以下代码片段添加到您的~/.bash_aliases
:
# Function for custom Git command (will only work for single files)
_git_commit_push() {
git add "$1" && \
git commit -m "$2" && \
git push origin "$3"
}
alias gc='_git_commit_push'
现在,当您重新加载 Bash 配置时,应该定义此函数和别名。
注意这三个参数:$1
、$2
和$3
。这些是函数的命令行参数。还请注意表达式&& \
(逻辑与加上转义换行符)只有运行第一个命令后才会运行后续命令。
现在,您可以使用与三个字符串(包名称、自定义消息和分支名称)对应的三个参数来运行函数(或别名gc
)。确保所有包含空格的参数都括在引号中,如下所示:
gc "src/ package.json any_other_file" "This is my commit message" main
您还可以添加一些健全性检查,例如,您要添加的文件是否存在:
(现在已修改以适应多个文件作为参数$1
)
# Function for custom Git command (will work for multiple files as argument $1)
_git_commit_push() {
# Split first argument into array
read -a filelist <<< "$1"
# Iterate over array of files
for file in "${filelist[@]}"
do
# Test if the file $file does NOT (!) exist (-e)
if [[ ! -e "$file" ]]
# This is what happens when the file DOES NOT exist
then
echo "Error: The file $file does not exist!"
return 1 # Exit function with error code 1
# This is what happens when the file DOES exist
else
git add "$file"
fi
done
# Run the remaining commands to commit and push
git commit -m "$2" && \
git push origin "$3"
}
答案2
@arturmeinild 方法非常好。如果您需要跟踪更多此类别名或脚本命令,您可以创建一个文件夹/home/$USER/bin
并将命令存储在单独的脚本文件中。
mkdir /home/$USER/bin
cd /home/$USER/bin
touch gc
chmod 755 gc
gedit gc
将以下内容粘贴到文件中
#!/bin/bash
git add "$1" && \
git commit -m "$2" && \
git push origin "$3"
保存并关闭文件。在您的文件中~/.bashrc
,如果尚未添加此行,请将其添加到末尾(检查是否有类似的路径导出命令)
export PATH=$PATH:/$HOME/bin
现在您可以在任何地方使用这些命令。您可以扩展它来执行任何操作。例如,如果在使用上述命令gc
时出现错误,则设置命令失败。set -e
此外,如果您同步此文件夹或在任何可同步文件夹中创建上述命令脚本文件,您将备份此命令。
答案3
您正在寻找的是如上所述的功能
git 命令别名也存在于 ~/.gitconfig 中,你可以在别名部分添加一些较短的命令
[alias]
ci = commit
co = checkout
st = status -uno
bn = rev-parse --abbrev-ref HEAD
这将允许您使用更短的命令(请注意,我使用 clearcase 等别名 ;-) )
git add newfile # not worth for 3 letters command
git ci -am 'feat: added feature blabla' # note this will commit ALL updated files too
git push <remote-name> $(git bn)
您还可以以同样的方式重用更复杂的命令,例如
# branch owners(last commit) on remote
bown = for-each-ref --sort=committerdate refs/remotes/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(authorname) (%(color:green)%(committerdate:short)%(color:reset))'
l = log --oneline -n 10 --decorate=short
lg = log -n10 --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %C(bold blue)<%an>%Creset' --abbrev-commit