如何使用存储库和 refspec 为 git 子树推送命令创建别名
How to make an alias for git subtree push command with repository and refspec
我想为以下命令定义一个快捷方式(别名):
git subtree push --prefix=_site git@github.com:mertnuhoglu/blog_datascience.git gh-pages
我希望能够使用快捷方式,这样我就不需要指定存储库名称。即使在不同的回购协议中使用它。
这可能吗?我该怎么做?
在您用户的主目录中
- Windows:
C:\Users\<user-name>
(或 git-bash:/c/Users/<user-name>
)
- Linux:
/home/<user-name>
- Mac:
/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
失败了,你又要体力劳动了。
我想为以下命令定义一个快捷方式(别名):
git subtree push --prefix=_site git@github.com:mertnuhoglu/blog_datascience.git gh-pages
我希望能够使用快捷方式,这样我就不需要指定存储库名称。即使在不同的回购协议中使用它。
这可能吗?我该怎么做?
在您用户的主目录中
- Windows:
C:\Users\<user-name>
(或 git-bash:/c/Users/<user-name>
) - Linux:
/home/<user-name>
- Mac:
/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
失败了,你又要体力劳动了。