是否有一种单命令方式来获取远程仓库的最新镜像? 那是
我知道我可以编写脚本(例如if [ -d repo ]; then (cd repo && git pull); else git clone $repourl;fi
),但我需要最简单的跨平台方式(实际上用于Jenkins-CI,我知道默认情况下这样做,但我需要2个回购支持有限)。
Git在其他方面有类似的快捷方式(例如checkout -b,并自行拉动),所以我想知道我是否错过了什么。谢谢!
答案 0 :(得分:55)
没有,因为在现有的repos上运行的命令都假设它们在给定的仓库中运行。
也就是说,如果你在shell中运行,你可以简单地使用shell内置函数。例如,这是bash:
if cd repo; then git pull; else git clone https://server/repo repo; fi
检查repo
是否是有效目录,如果是,则在其中pull
;否则它会clone
创建目录。
答案 1 :(得分:38)
最干净的单线可能是
git -C repo pull || git clone https://server/repo repo
答案 2 :(得分:3)
git pull
知道从哪里克隆,因为本地repo在其本地配置中注册了一个远程。它在一棵工作树上运作。
但是git clone
没有,它必须在参数中传递一个显式的远程url才能克隆。它在工作树之外运作。
存在 not 这种快捷方式的主要原因是:
git init
很少用于给定的回购:它是回购生活中的一次性命令。git submodule update --init
。git pull
经常在给定的回购中。 git pull本身就是一个捷径(git fetch
+ git merge
)。即使git pull --rebase
是git fetch
+ git rebase
的另一种快捷方式。考虑到您使用git init
的次数,这样的快捷方式不是高优先级。
因此,脚本仍然是定义所需内容的最可靠方法。
答案 3 :(得分:2)
git -C repo pull
仅适用于git 1.8.5或更高版本。要在早期版本上实现此目的,请尝试:
remote_repo=https://server/repo
local_repo=repo
if [ -d $local_repo/.git ]; then pushd $local_repo; git pull; popd; else git clone $remote_repo; fi
答案 4 :(得分:1)
如果不是升级git,并且您不想为存储库传递参数,则脚本方法可能是:
#!/bin/bash
function clone_pull {
DIRECTORY=$(basename "$1" .git)
if [ -d "$DIRECTORY" ]; then
cd "$DIRECTORY"
git pull
cd ../
else
git clone "$1"
fi
}
clone_pull https://github.com/<namespace>/<repo>
# or
clone_pull git@github.com:<namespace>/<repo>.git
答案 5 :(得分:0)
由于您提到了詹金斯(Jenkins),因此可以使用Jenkins SCM API进行克隆或提取。 checkout
方法完全可以满足您的需求。
您可以从groovy脚本中运行它,如下所示:
dir (targetFolder) {
checkout(scm: [$class: 'GitSCM', branches: [[name: 'master']], ...])
}
请注意,它不会从git的意义上签出指定的分支,而是在相应的提交时将工作空间留在独立的头上。