Shell:如果git clone if文件夹已经存在,请不要失败

时间:2016-04-08 11:57:59

标签: git shell

我正在编写自动脚本。

在某些时候,我正在呼叫git clone <repo>。但是这个操作有可能已经完成。

如何调用git clone --no-fail以便忽略存储库?

由于

7 个答案:

答案 0 :(得分:16)

最稳定的解决方案就是让它失败。

您可以执行以下操作:

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

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

答案 1 :(得分:8)

派对有点晚了,但是我正在做类似的事情,但我想确保回购是最新的,如果它已经存在,那么为了扩大上述答案如果回购已经存在你可以拉,以确保它的最新的。

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

答案 2 :(得分:1)

你没有告诉我们为什么它可能已存在或任何背景。

我非常想在[ -e $folder ] && rm -rf $folder之前添加$folder(确保git clone是理智的),因为我不希望我的软件使用任何恰好存在的旧文件夹谁知道哪个州......

答案 3 :(得分:1)

git clone $url || true会使set -e的{​​{1}}的shell运行在git clone失败后失败。

如果这不是您想要的,那么建议的目标目录的显式测试解决方案应该可以使用。

他们唯一的问题是,您需要模拟Git的方法来确定其名称。

这样的事情应该有效:

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

那些&#34;技巧&#34; ##%%standard featues of the "parameter expansion" rules of POSIX shells

答案 4 :(得分:1)

它使回购最新。

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

答案 5 :(得分:0)

git clone中没有任何选项可以避免在克隆已经存在的情况下进行克隆。最好的选择是:

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

答案 6 :(得分:0)

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

请参阅 commit a4a1ca2Taylor Blau (ttaylorr)(2021 年 1 月 11 日)。
(于 2021 年 1 月 15 日在 Junio C Hamano -- gitster --commit 8782bfb 合并)

<块引用>

Documentation/git-clone.txt:与 --local

的文档竞争

建议人:Junio C Hamano
签字人:Taylor Blau

<块引用>

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

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

<块引用>

注意:此操作可以与并发修改竞争 源存储库,类似于在修改时运行 cp -r src dst src