我试图将回购用作不同项目的起点。
我在这里遵循了这个要点: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}
并且工作正常。
感谢您的帮助
答案 0 :(得分:1)
作为PetSerAl noted in a comment,cd
会影响执行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
。