git别名不等待克隆在cd进入项目之前完成?

问题描述 投票:0回答:1

我正在尝试使用回购作为不同项目的起点。

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

从gist开始,我创建了一个如下所示的别名:

boilerplate-website = !git clone -o website-boilderplate https://[email protected]/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}

这很好。

谢谢你的帮助

git
1个回答
1
投票

作为PetSerAl noted in a commentcd影响执行cd命令的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://[email protected]/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

© www.soinside.com 2019 - 2024. All rights reserved.