代码之家  ›  专栏  ›  技术社区  ›  Nick

git alias在将cd放入项目之前不等待克隆完成吗?

git
  •  0
  • Nick  · 技术社区  · 8 年前

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

    我确实遵循了以下要点: 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 回复  |  直到 8 年前
        1
  •  1
  •   torek    8 年前

    像 PetSerAl noted in a comment , cd 影响执行 cd光盘 命令,以及该shell本身生成的任何子命令/子shell;但它不会影响任何“外层”壳,就像您键入的壳一样 git boilerplate-website . (The ! 在中,别名的意思是:“通过子shell运行它。”)

    这对你来说意味着你无法通过这种方式实现你想要的。您需要Shell,在其中键入一些命令以执行 cd光盘 命令

    方法是使用 shell函数 或 shell别名 (后者不同于 Git别名 ). 定义shell函数或shell别名的细节略有不同,具体取决于您使用的shell,但在bash和类似bash的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 .