我想为以下命令定义一个快捷方式(别名):
git subtree push --prefix=_site git@github.com:mertnuhoglu/blog_datascience.git gh-pages
我希望能够使用快捷方式,以便我不需要指定存储库名称。即使在不同的回购中使用它。
这可能吗?我怎么能这样做?
答案 0 :(得分:2)
在您的用户的主目录中
C:\Users\<user-name>
(或git-bash:/c/Users/<user-name>
)/home/<user-name>
/Users/<user-name>
创建或打开名为.bashrc
的文件,并附加以下行
alias gsp="git subtree push --prefix=_site git@github.com:mertnuhoglu/blog_datascience.git"
然后打开一个新的(git-)bash,别名gsp
应该可用。
<强>更新强>
此更新描述了一种更通用的方法,该方法适用于多个子树和任何git存储库(已相应配置)。
请求的别名需要一种机制来自动推断
每个子树。
据我所知git-subtree
只将提交的哈希存储在已被引用的远程存储库中(可能还有它的历史记录),但它不存储该远程的地址,可以看到在玩具示例git-log
的输出中:
* 1ffc070 Merge commit '7a9390a29011dad36b2def6b0d0881b0361875e8' as 'bar.st'
|\
| * 7a9390a Squashed 'bar.st/' content from commit 10e3347
* 429987f - Added foo.
所以,有一个简单的解决方案。
但是如何将上述枚举中所需的信息存储在配置文件中,例如: .gitsubtrees
和每个存储库一起?该文件使用简单的文件格式:
# <prefix>;<remote address/name>;<remote branch>
bar.st:../bar:master
_site;git@github.com:mertnuhoglu/blog_datascience.git;master
# ...
然后将以下功能添加到.bashrc
:
function gsp
{
# Config file for subtrees
#
# Format:
# <prefix>;<remote address>;<remote branch>
# # Lines starting with '#' will be ignored
GIT_SUBTREE_FILE="$PWD/.gitsubtrees"
if [ ! -f $GIT_SUBTREE_FILE ]; then
echo "Nothing to do - file <`basename $GIT_SUBTREE_FILE`> does not exist."
return
fi
OLD_IFS=$IFS
IFS=$'\n'
for LINE in $(cat $GIT_SUBTREE_FILE); do
# Skip lines starting with '#'.
if [[ $LINE = \#* ]]; then
continue
fi
# Parse the current line.
PREFIX=`echo $LINE | cut -d';' -f 1`
REMOTE=`echo $LINE | cut -d';' -f 2`
BRANCH=`echo $LINE | cut -d';' -f 3`
# Push to the remote.
echo "git subtree push --prefix=$PREFIX $REMOTE $BRANCH"
git subtree push --prefix=$PREFIX $REMOTE $BRANCH
done
}
如果对于某些git存储库,配置文件.gitsubtrees
不存在,gsp
不会做任何事情,否则它将打印它执行的命令和相应的输出。
$ gsp
git subtree push --prefix=bar.st ../bar master
git push using: ../bar master
-n 1/ 3 (0)
-n 2/ 3 (1)
-n 3/ 3 (1)
注意:为了便于阅读,gsp
的代码忽略了健全性检查,也没有处理异常。如果git subtree push
无法退回手工劳动。