使用git filter-repo的commit.skip()移除提交时后续提交被误跳过求助
问题:使用git filter-repo的commit.skip()时后续提交被全部跳过
尝试用commit.skip()根据提交信息或文件名移除仓库历史中的提交,但发现只要条件判断为真,历史里所有后续提交都会被无条件跳过。
用于根据文件名跳过提交的代码(存在语法问题):
git filter-repo --commit-callback for change in commit.file_changes: if b"index" in change.filename: commit.skip()
用于根据提交信息跳过提交的代码(存在语法问题):
git filter-repo --commit-callback if b"index" in commit.message: commit.skip()
条件逻辑本身是正确的,因为用以下代码修改提交信息时,仅会影响符合条件的提交:
git filter-repo --commit-callback if b"index" in commit.message: commit.message = b"new commit message"
请问该如何解决这个问题?
解决方案
问题根源是回调函数的shell语法错误:提交给--commit-callback的Python代码没有用单引号(')包裹,导致shell将换行后的代码解析为独立命令,实际执行的回调逻辑不完整,进而引发后续提交被全部跳过的异常。
修正后的代码如下:
根据文件名跳过提交
git filter-repo --commit-callback ' for change in commit.file_changes: if b"index" in change.filename: commit.skip() break # 匹配到目标文件后跳出循环,避免重复调用skip() '
根据提交信息跳过提交
git filter-repo --commit-callback ' if b"index" in commit.message: commit.skip() '
在文件名匹配逻辑中添加break,可以避免同一提交内多个文件匹配时重复调用commit.skip(),虽不影响功能,但能让逻辑更严谨。
修改后,commit.skip()只会跳过符合条件的提交,后续不满足条件的提交会正常保留,且父节点会自动调整为被跳过提交的父节点,保证历史连贯性。
内容的提问来源于stack exchange,提问作者Tommaso
相关产品推荐
相关产品推荐

