git alias在CD进入项目之前是否等待克隆完成?

时间:2017-12-29 23:00:51

标签: git

我试图将回购用作不同项目的起点。

我在这里遵循了这个要点:https://gist.github.com/mdentinho/6258238

从要点出发,我创建了一个如下所示的别名:

boilerplate-website = !git clone -o website-boilderplate https://user@bitbucket.org/user/website-boilderplate.git "$1" && cd "$1" && rm readme.md && touch readme.md && rm -rf .git && git init && git add -A && git commit -m 'First Commit'

但看起来CD部分无法正常工作,因为我仍然在目录中运行命令,而不是在新克隆的目录中。

另外,由于这个原因,我收到了这个错误,而别名并没有完成所有命令(它只是克隆而且它就是这样)。

Cloning into 'test2'...
remote: Counting objects: 19, done.
remote: Compressing objects: 100% (18/18), done.
Unpacking objects: 100% (19/19), done.
remote: Total 19 (delta 1), reused 0 (delta 0)
rm: readme.md: No such file or directory

为什么不等待克隆完成?我经常做用户

git clone {repo} {folder name} && cd {folder name}

并且工作正常。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

作为PetSerAl noted in a commentcd会影响执行cd命令的shell,以及shell本身产生的任何子命令/子shell;但它不会影响任何"外层" shell,就像您键入git boilerplate-website的那个。 (别名中的!表示:"通过子shell运行。")

这对你意味着你无法通过这种方式达到你想要的目标。您需要shell(您键入一些命令的shell)来执行cd命令。

这样做的方法是使用 shell函数 shell别名(后者与 Git别名不同)。定义shell函数或shell别名的细节根据你使用的shell而略有不同,但它在bash和bash-like shell中很常见:

func() {
   commands
}

是定义函数的方法(例如在$HOME/.bashrc中),并且:

alias name='expansion with arguments'

是定义别名的方法。因此你可以写:

newwebsite() {
    case $# in
    1) ;;
    *) echo "usage: newwebsite <name>" 1>&2; return 1;;
    esac
    git clone -o website-boilderplate \
        https://user@bitbucket.org/user/website-boilderplate.git \
        "$1" || { echo "git clone step failed, aborting" 1>&2; return 1; }
    cd "$1" &&
    rm readme.md &&
    touch readme.md &&
    rm -rf .git &&
    git init &&
    git add -A &&
    git commit -m 'First Commit'
}

(我已经把它写成了一个函数,试图让它尽可能地可读,同时保持你的结构完整。)注意你可以在它前面没有git命令的情况下运行它,即newwebsite foo而非git newwebsite foo