从位于同一个 git 存储库中的 shell 脚本 "git pull" 是否安全?

Is it safe to "git pull" from a shell script that lives in the same git repo?

我有一个 git 存储库已克隆并部署在需要从 GitHub 中的远程 git 位置定期更新的服务器中。由于无关操作原因,我们无法将更新推送到服务器,只能轮询远程检查是否有更新。

我们正在考虑通过在执行 git 拉取和其他一些操作的 cronjob 上安装更新 shell 脚本 运行 来解决这个问题。此脚本是部署的同一个 git 项目的一部分。

我的问题是,让脚本从它所在的同一个存储库执行 git 拉取是否安全?脚本本身可能会在未来发展和变化,并且会覆盖自己。

我已经做了一些初步测试,似乎没有问题,但我想问问社区,看看是否有我们没有考虑到的副作用或问题。

“安全”是一种主观术语。以下是 将脚本放在同一个 repo 中的一些(人为的)原因:

  1. 如果有人在脚本中引入了阻止其自身在未来更新的错误,它可能会卡住并需要手动干预来修复。
  2. 如果没有手动干预,脚本本身可能无法重命名或移动。当脚本未 运行ning.
  3. 时,可能需要更新存储库
  4. 如果一个恶意的人获得了 repo 的访问权限并以这种方式改变脚本来做一些危险的事情,该脚本将自动 运行。

话虽如此,直接从存储库中 运行 脚本是很常见的。 #1 和 #2 不是 运行 在回购之外使用脚本的充分理由。当然,他们需要手动干预来解决问题,但是将其与开始时将脚本放在回购协议之外进行比较,然后您需要手动干预每次 更新脚本.

关于“安全”,出于安全目的,主要是 #3 是相关的,重要的是要注意,无论您 运行来自的脚本,可以说这将更难检测并且更具破坏性。

权衡这些评论,我会说,,一般来说,运行 回购中的脚本可能是“安全的”。

提示: 如果您的服务器没有在您拉取的分支上创建自己的提交,我想提出 git pull 的替代方案:

git fetch
git reset --hard @{u}

注意 @{u} 与分支无关,指的是上游分支,但您可以 hard-code 它是 origin/main (或任何您的分支名称),如果您愿意的话。

略微 更好的原因有两个:

  1. 在(希望很少见!)远程分支被强制推送的情况下,此脚本将继续按预期工作。如果您使用 pull,它会尝试将新强制推送的提交与以前版本的提交合并,这当然是不可取的。
  2. 如果您的自动化 确实 创建了本地提交但它不应该创建怎么办?然后,当您拉取时,您将再次获得合并提交。

另一种可能的替代方法是将 git pull 更改为:

git pull --ff-only

这样做与重置的主要区别在于重置每次都会起作用,即使发生上述 2 个潜在问题。 pull --ff-only 会在 2 个潜在问题中的任何一个上出错*,而不是可能默默地成功并产生一些不良结果。

*如果强制推送仅删除提交(通过重置回较早的提交)而不添加任何新提交,那么 git pull --ff-only 仍将成功并显示“已经是最新的”。不过,硬重置仍然有效。