56

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

  • 如果本地仓库还没有:克隆
  • 如果它在那里:拉

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

Git 对其他事情有类似的快捷方式(例如 checkout -b 和 pull 本身),所以我想知道我是否遗漏了什么。谢谢!

4

7 回答 7

84

没有,因为在现有存储库上运行的命令都假定它们正在给定的存储库中运行。

也就是说,如果你在 shell 中运行,你可以简单地使用 shell 内置函数。例如,这里是 bash:

if cd repo; then git pull; else git clone https://server/repo repo; fi

这会检查是否repo是一个有效的目录,如果是,则pull在其中执行一个;否则它会clone创建目录。

于 2013-03-24T18:09:15.987 回答
58

最干净的单线可能是

git -C repo pull || git clone https://server/repo repo
于 2015-07-02T13:53:16.123 回答
3

如果升级 git 不是一个选项,并且您不想为 repo 传递参数,则脚本方法可能是:

#!/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
于 2018-08-17T19:47:17.473 回答
3

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
于 2018-03-08T14:03:51.970 回答
0

git pull知道从哪里克隆,因为本地 repo 在其本地配置中注册了一个远程。它从工作树运行。

git clone不是,它必须有一个显式的远程 url 传入参数才能克隆。它在工作树之外运行。

这种快捷方式不存在的主要原因是:

  • git init很少为给定的 repo:它是 repo 生命周期中的一次性命令。
    另外,它可能需要额外的命令才能完成:例如,如果您有子模块,则需要添加一个git submodule update --init.
  • git pull经常在给定的回购中。git pull 本身就是一个快捷方式(对于git fetch+ git merge)。Evengit pull --rebasegit fetch+的另一个快捷方式git rebase

考虑到您要使用的次数git init,这样的快捷方式并不是一个高优先级。

因此,脚本仍然是定义所需内容的最可靠方法。

于 2013-03-24T18:09:10.907 回答
0

由于您提到了 Jenkins,因此可以使用Jenkins SCM API进行克隆或拉取。该checkout方法完全符合您的要求。

您可以像这样从 groovy 脚本运行它:

dir (targetFolder) {
  checkout(scm: [$class: 'GitSCM', branches: [[name: 'master']], ...])
}

请注意,它不会在 git 意义上检查指定的分支,而是在相应的提交时将工作空间留在一个分离的头上。

于 2019-03-26T20:01:42.617 回答
0

这是另一个 1-liner。与此处的其他解决方案相比,此代码不会在终端中输出错误:

(test -d my-repo && git -C my-repo pull --rebase) || \
  git clone https://github.com/my-repo my-repo

这是一个变体,其中 repo 和源 URL 是变量,因此您不需要重复 repo-folder 三次:

DIR=my-repo && ORIGIN=https://github.com/my-repo/ && \
  (test -d $DIR && git -C $DIR pull --rebase) || git clone $ORIGIN $DIR
于 2021-10-15T22:12:31.473 回答