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

ing*_*ger 46 git jenkins

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

  • 如果当地的回购还没有:克隆
  • 如果它在那里:拉

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

Git有其他类似的快捷方式(例如checkout -b和pull自己),所以我想知道我是否错过了什么.谢谢!

Amb*_*ber 61

没有,鉴于在现有repos上运行的命令都假设它们在给定的repo中运行.

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

if cd repo; then git pull; else git clone https://server/repo repo; fi
Run Code Online (Sandbox Code Playgroud)

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

  • 关于脚本部分的答案比我的更精确:+1 (2认同)

jhr*_*mnn 43

最干净的单线可能是

git -C repo pull || git clone https://server/repo repo
Run Code Online (Sandbox Code Playgroud)

  • 在<1.8.5(2013年第四季度)的Git版本上,它是“未知选项:-C” (2认同)

Von*_*onC 1

git pull知道从哪里拉取,因为本地存储库在其本地配置中注册了一个远程。它从工作树运行。

git clone事实并非如此,它必须在参数中传递明确的远程 URL 才能进行克隆。它在工作树之外运行。

这种捷径不存在的主要原因是:

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

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

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

  • 顺便说一句,我犹豫是否接受这个答案的原因是我发现它有点误导..我的意思是:git“可以”提供这个快捷方式,但它没有 - 所以客户端工具(脚本,CI等)必须这样做他们自己..没什么大不了的,但它与克隆和拉取的一些临时限制没有太大关系。正如“checkout -b”创建分支以及签出(相反,git-gui 在创建分支时提供签出)一样,在 git 中添加一个很好的“微小”功能可以一次性完成这些操作(除非它违反某些原则) )。所以对我来说,答案听起来像是:还没有捷径,你需要编写脚本。 (3认同)