gpt4 book ai didi

git - 如何使用 --commit-filter 在一个 git filter-branch pass 中排除 20 个提交?

转载 作者:行者123 更新时间:2023-12-02 17:23:25 26 4
gpt4 key购买 nike

我需要从裸仓库中的 git 历史记录中连续清理 20 次提交。我尝试使用以下命令(注意,我不想编写全长哈希并尝试使用子字符串比较):

git filter-branch -d /dev/shm/scratch --commit-filter '
if [ ${GIT_COMMIT0:7} = e687d59 ] ||
[ ${GIT_COMMIT0:7} = 58daf29 ] ||
...
[ ${GIT_COMMIT0:7} = 682b2c2 ] ||
[ ${GIT_COMMIT0:7} = 947db9e ];
then
skip_commit "$@";
else
git commit-tree "$@";
fi' --tag-name-filter cat -- --all

但我立即收到如下消息:

Rewrite 414840693169a74d052548c7a7a1bc5b06d3b79c (1/10360) (0 seconds passed, remaining 0 predicted) git commit-tree: 49: git commit-tree: Bad substitution could not write rewritten commit

OR 条件或子字符串有一些错误,我无法弄清楚。

我还有一个问题:当 git filter-branch 完成它的工作时,如何获取日志文件并将旧 HashMap 到新哈希?

最佳答案

基本问题是:

if [ ${GIT_COMMIT0:7} = e687d59 ] ||
[ ${GIT_COMMIT0:7} = 58daf29 ] ||
...
[ ${GIT_COMMIT0:7} = 682b2c2 ] ||
[ ${GIT_COMMIT0:7} = 947db9e ];

错了。

子字符串的 bash 语法是 ${<em>name</em>:<em>offset</em>:<em>length</em>} ,在本例中为 ${GIT_COMMIT:0:7} ,即您缺少一个冒号。

但是:

  • git filter-branch是一个 sh(不是 bash)脚本;
  • 过滤分支脚本使用eval ;和
  • 无论如何,这并不是最好的方法。

前两个意味着您不能在这里依赖特定于 bash 的语法。

第三种意思是没有真正的理由这样做。

一种选择是使用 -o (或)[ 的运算符(又名 test)程序:

if [ $GIT_COMMIT = ... -o
$GIT_COMMIT = ... -o
...
$GIT_COMMIT = ... ]; then

但在我看来,这仍然太痛苦了。相反,为什么不使用 grep ,例如:

if echo $GIT_COMMIT | grep -F -f /tmp/list >/dev/null; then

文件所在的位置 /tmp/list包含您要跳过的 ID?如果 grep 找到其中之一,它将以零(成功)状态退出,否则以非零(失败)状态退出,与 test 相同。或 [如果测试成功则程序退出 0,如果失败则退出非零。

(如果你的 grep 有 -q ,你可以使用它而不是重定向到 /dev/null 。)

关于git - 如何使用 --commit-filter 在一个 git filter-branch pass 中排除 20 个提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40849593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com