【问题标题】:Rescue git pull救援 git pull
【发布时间】:2023-04-03 22:07:01
【问题描述】:

我使用git pull 来确保本地存储库是最新的。但是,git pull 有时会失败。如果您有未提交的更改,git pull 将失败。是否有 git 或 shell 选项来确保如果命令失败,脚本的其余部分会继续执行?

目前的脚本是:

if [ -d "some-repo" ]; then
  cd "some-repo"
  git pull
  #RESCUE????
else
  git clone git@github.com:USERNAME/some-repo.git
  cd "some-repo"
fi

我不想结帐一个分支,我并不真正关心不同分支中正在进行的工作。我知道可以使用git reset --hard 或使用--force 命令,但我想确保它是安全的,并且该代码不会丢失。

【问题讨论】:

  • 脚本的棘手之处在于:git pull 实际上是一个git fetch,后跟一个git merge,是新更新的跟踪分支到其本地分支对应项。提取可能会失败,但合并也可能会失败。所以我认为你需要考虑失败的类型。
  • 您可以在每次创建 git pull 之前进行预防性 git stash,然后是 git stash pop。请记住,当您git stash pop 时可能会出现冲突。
  • @cfz42 我喜欢这个主意。如果存在冲突,pop 实际上不会弹出存储,因此您的更改是安全的。
  • 我只想提一下,如果我不使用 ruby​​ 进行编程,我可能会将其描述为 try / catch git pull。

标签: git bash shell


【解决方案1】:

您可以在 if 子句中写入您的 git pull

if git pull; then
    # Here, git has successfully pulled
else
    # Here goes code for dealing with a failed pull
fi

【讨论】:

  • set -e 与 OP 要求的相反
  • 我将do 更改为then,并将done 更改为fi,以使其与我的shell 一起工作。我认为这是一种很酷的、基于 shell 的方式来覆盖 git pull 的退出。如果它有效,它 git pull 必须返回类似 true 的东西,如果它没有返回 false 。我仍然需要处理失败的拉取。
  • 是的,bash 在条件句中使用“if then else fi”,但循环是“for do done”。我很困惑:p 但是你所说的“git pull 必须返回类似真实的东西”,这是正确的。在 Unix 中,所有命令在终止时都会向操作系统返回一个值。约定是当程序成功时这个值是 0,当发生不好的事情时这个值是非零(但不是所有程序都遵循这个约定)。不管怎样,shell 可以访问这个值(它在你调用git pull 之后存储在变量$? 中),并使用它来决定要遵循哪个条件分支。
【解决方案2】:

我想说你可以在拉取回购之前添加这两行。

git add . git commit -am "sync repo"

只要没有合并冲突,这应该可以工作。

【讨论】:

  • 我真的不想用“同步回购”的消息填充 git 历史记录。这将使跟踪更改更加困难。我真的不觉得我应该提交我在回购中的任何随机内容。我尝试对我的承诺更加有意识,比如“添加离散解耦的东西”。
【解决方案3】:

在你的情况下,我认为 git fetch 更好。 git pull 总是将远程跟踪分支合并到你当前的 HEAD 中。它可能是一个非快进合并,如果您与其他人合作,这可能会使您的签出分支的历史有点混乱。通过 git fetch 你只需要更新远程跟踪分支,然后你可以决定如何处理新的提交,将它们全部合并或者只是挑选一些到你的主分支。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 2015-08-30
    相关资源
    最近更新 更多