decipher Asked: 2023-02-18 06:55:08 +0800 CST2023-02-18 06:55:08 +0800 CST 2023-02-18 06:55:08 +0800 CST 执行期间更新 772 我在 git 仓库中有一个 bash 脚本。我git pull在脚本内部使用来更新。但有时,当我对脚本本身进行更改时,整个脚本会崩溃,因为它在执行过程中发生了更改。我想要一些东西来更新这个文件,但不是在执行期间。 我怎么能这样做? bash 1 个回答 Voted Best Answer White Owl 2023-02-18T07:13:59+08:002023-02-18T07:13:59+08:00 通用方式 解决此类问题的一种常见方法是拥有两个版本的脚本 - 一个运行,另一个存储在存储库中。它适用于任何版本控制系统,即使脚本是从网上下载的。 例如,您可以拥有update.sh.in(将其添加到存储库): #!/bin/bash git pull if [ update.sh.in -nt update.sh ]; then cp update.sh.in update.sh; fi # actual work of the script # any line here can be changed in the next version of the script 手动将该文件复制到update.sh,将其包含到.gitignore. 运行update.sh. 这里的诀窍是前三行不应该被修改。只要.sh.ininto的副本.sh保持在脚本的相同位置 - 它就可以毫无问题地运行。 该.in扩展是各种工具的传统扩展,可从模板文件生成实际脚本或源代码。 GIT 钩子 另一种也很常见但可能不那么常见的方法是:使用 git hooks。这是特定于 GIT 的方法。您可以编写其他脚本并将它们放在.git/hooks目录中。Git 将在不同的执行点调用这些脚本。 您没有具体说明您需要做什么git pull。但也许,您可以将您的特殊工作放入.git/hooks/pre-rebaseor中.git/hook/post-merge。这是自动调用的git pull。 有关钩子的完整列表,请阅读此处:https://git-scm.com/docs/githooks
通用方式
解决此类问题的一种常见方法是拥有两个版本的脚本 - 一个运行,另一个存储在存储库中。它适用于任何版本控制系统,即使脚本是从网上下载的。
例如,您可以拥有
update.sh.in
(将其添加到存储库):手动将该文件复制到
update.sh
,将其包含到.gitignore
. 运行update.sh
.这里的诀窍是前三行不应该被修改。只要
.sh.in
into的副本.sh
保持在脚本的相同位置 - 它就可以毫无问题地运行。该
.in
扩展是各种工具的传统扩展,可从模板文件生成实际脚本或源代码。GIT 钩子
另一种也很常见但可能不那么常见的方法是:使用 git hooks。这是特定于 GIT 的方法。您可以编写其他脚本并将它们放在
.git/hooks
目录中。Git 将在不同的执行点调用这些脚本。您没有具体说明您需要做什么
git pull
。但也许,您可以将您的特殊工作放入.git/hooks/pre-rebase
or中.git/hook/post-merge
。这是自动调用的git pull
。有关钩子的完整列表,请阅读此处:https://git-scm.com/docs/githooks