如何使用存储库和 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

我希望能够使用快捷方式,这样我就不需要指定存储库名称。即使在不同的回购协议中使用它。

这可能吗?我该怎么做?

在您用户的主目录中

  1. Windows:C:\Users\<user-name>(或 git-bash:/c/Users/<user-name>
  2. Linux: /home/<user-name>
  3. Mac: /Users/<user-name>

创建或打开名为 .bashrc 的文件并附加以下行

alias gsp="git subtree push --prefix=_site git@github.com:mertnuhoglu/blog_datascience.git"

然后打开一个新的 (git-)bash 并且别名 gsp 应该可用。

更新

此更新描述了一种更通用的方法,它适用于多个子树和任何 git 存储库(已相应配置)。

请求的别名需要一种自动推断的机制

  1. 前缀
  2. 遥控器的名称或其地址,以及,
  3. 远程分支

对于每个子树。

据我所知 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 失败了,你又要体力劳动了。