如何使用repository和refspec为git subtree push命令创建别名

时间:2015-06-28 10:03:15

标签: git alias git-subtree

我想为以下命令定义一个快捷方式(别名):

    git subtree push --prefix=_site git@github.com:mertnuhoglu/blog_datascience.git gh-pages

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

这可能吗?我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

在您的用户的主目录中

  1. Windows:C:\Users\<user-name>(或git-bash:/c/Users/<user-name>
  2. Linux:/home/<user-name>
  3. Mac:/Users/<user-name>
  4. 创建或打开名为.bashrc的文件,并附加以下行

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

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

    <强>更新

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

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

    1. 前缀
    2. 遥控器的名称或其地址,以及
    3. 远程分支
    4. 每个子树。

      据我所知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无法退回手工劳动。