【问题标题】:Shell: don't fail git clone if folder already existsShell:如果文件夹已经存在,不要让 git clone 失败
【发布时间】:2016-07-29 16:20:11
【问题描述】:

我正在编写一个自动化脚本。

在某个时候,我会打电话给git clone <repo>。但是这个操作有可能已经完成了。

如果存储库存在,我如何调用git clone --no-fail 使其忽略?

谢谢

【问题讨论】:

    标签: git shell


    【解决方案1】:

    最稳定的解决方案是让它失败并打印错误消息。如果您认为这对您的场景来说太丑陋了,您可以将其重定向到 /dev/null:

    folder="foo"
    if ! git clone "${url}" "${folder}" 2>/dev/null && [ -d "${folder}" ] ; then
        echo "Clone failed because the folder ${folder} exists"
    fi
    

    否则你可以这样做:

    if [ ! -d "$FOLDER" ] ; then
        git clone "$URL" "$FOLDER"
    fi
    

    但这很容易受到竞争条件的影响。

    【讨论】:

    • 我不太担心比赛条件。但是如果检查目录是否是实际的 git 目录(通过查看 git remote 或其他东西),我会发现它很有趣。类似mkdir -p 的行为。感谢您的回答
    • @AugustinRiedinger 是的,我也在搜索手册页,但看起来没有..
    【解决方案2】:

    聚会有点晚了,但我正在做类似的事情,但我想确保如果回购已经存在,那么它是最新的,因此如果回购已经存在,那么扩展上述答案,然后你可以拉动以确保它是是最新的。

    if [ ! -d "$FOLDER" ] ; then
        git clone $URL $FOLDER
    else
        cd "$FOLDER"
        git pull $URL
    fi
    

    【讨论】:

      【解决方案3】:

      git clone $url || true 将使运行 set -e 的 shell 在 git clone 失败时不会失败。

      如果这不是您想要的,那么建议的解决方案对已经存在的目标目录进行显式测试应该可以工作。

      他们唯一的问题是你需要模拟 Git 的方法来找出它的名字。

      这样的事情应该可以工作:

      url=git://host/path/name.git
      last=${url##*/}
      bare=${last%%.git}
      test -e "$bare" || git clone "$url"
      

      ##%% 的“技巧”是standard featues of the "parameter expansion" rules of POSIX shells

      【讨论】:

        【解决方案4】:

        它使 repo 最新。

        git -C "$TARGET_DIR" pull || git clone https://github.com/<repo>.git "$TARGET_DIR"
        

        【讨论】:

        • 这看起来不错,我们正在为 CI 克隆一个外部工具库。我们会试试的
        【解决方案5】:

        如果克隆已经存在,git clone 中没有用于避免克隆的选项。您最好的选择是:

        [ ! -d 'MyRepo' ] && git clone https://github.com/Myorg/MyRepo.git
        

        【讨论】:

          【解决方案6】:

          你没有告诉我们为什么它可能已经在那里,或者任何上下文。

          我非常想在git clone 之前添加一个[ -e $folder ] &amp;&amp; rm -rf $folder(确保$folder 正常),因为我不希望我的软件使用任何旧文件夹,而这些旧文件夹恰好位于那里,谁知道是哪个状态...

          【讨论】:

          • rm -rf 方法很有趣。但理想情况下,如果文件夹存在且相同,则不会重复克隆操作。
          • 好吧,你无法知道文件夹是否相同。如果该文件夹存在但包含非常旧版本的存储库怎么办?还是在错误的分支上?
          【解决方案7】:

          使用 Git 2.30.1(2021 年第一季度),文档清楚地说明了多个并发 git clone 的竞争条件风险:

          参见Taylor Blau (ttaylorr)commit a4a1ca2(2021 年 1 月 11 日)。
          (由 Junio C Hamano -- gitster -- 合并到 commit 8782bfb,2021 年 1 月 15 日)

          Documentation/git-clone.txt: 使用 --local 记录竞赛

          推荐人:Junio C Hamano
          签名人:Taylor Blau

          运行 'git clone --local'(man) 时,如果另一个进程正在修改源存储库,则操作可能会失败。
          记录这种竞争条件,希望能帮助任何可能遇到它的人。

          git clone 现在包含在其man page 中:

          注意:此操作可能与同时修改 源存储库,类似于在修改时运行cp -r src dst src.

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-01
            • 1970-01-01
            • 2022-01-16
            • 1970-01-01
            • 1970-01-01
            • 2021-08-15
            • 1970-01-01
            • 2015-07-30
            相关资源
            最近更新 更多