如果还没有本地的话,Git快捷方式可以拉动克隆吗?

时间:2013-03-24 18:03:20

标签: git jenkins

是否有一种单命令方式来获取远程仓库的最新镜像? 那是

  • 如果还没有本地回购:clone
  • 如果它在那里:拉

我知道我可以编写脚本(例如if [ -d repo ]; then (cd repo && git pull); else git clone $repourl;fi ),但我需要最简单的跨平台方式(实际上用于Jenkins-CI,我知道默认情况下这样做,但我需要2个回购支持有限)。

Git在其他方面有类似的快捷方式(例如checkout -b,并自行拉动),所以我想知道我是否错过了什么。谢谢!

6 个答案:

答案 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 --rebasegit 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的意义上签出指定的分支,而是在相应的提交时将工作空间留在独立的头上。