在预提交期间拆分 git commit

Break a git commit apart during pre-commit

提问人:Thomas McQuitty 提问时间:9/30/2023 更新时间:9/30/2023 访问量:32

问:

我正在与一个基于注释处理构建的系统进行交互。每个文件都需要它自己的注释,我可以从第三方系统捕获注释。

预提交脚本似乎是执行此操作的最佳方法,因为它不需要任何其他进程(例如外部脚本)来执行该操作。

像这样的答案似乎是合适的。如果我能在提交后这样做,它就会起作用。但是,我正在尝试在提交期间执行此操作。

理想情况下,用户将独立提交每个文件,但这不会发生。

我在 .git/hooks/pre-commit 中的代码执行:我得到一个文件列表并为每个文件执行:。git --diff-index --name-only HEADgit add filename && git commit -m "unique comment" --no-verify

但是,如果我运行,我会得到以下内容:git status

$ git status
On branch dev
Your branch is ahead of 'origin/dev' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   FINANCE/ACCTPAY/COBOL/RICK6.cbl

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   FINANCE/ACCTPAY/COBOL/RICK6.cbl

我应该做些什么吗?如果我在预提交后运行,问题就会消失,但我不希望这些用户一直运行该命令,并且它在预提交脚本中不起作用。git reset head

git pre-commit-hook 预提交

评论


答:

0赞 bk2204 9/30/2023 #1

一般来说,虽然可以在阶段进行一些有限的修改,但你绝对不应该,而且尝试进行多次提交可能行不通,并且会遇到索引锁的争用。它还可能会破坏您所做的提交,因为提交的父级可能不引用您添加的提交。无论如何,绝对不支持提交中的提交,即使它现在工作,由于工作方式的细微变化,也可能随时中断。pre-commitgit commitgit commit

解决此问题的最好方法是改变构建方式,以便人们可以编写有意义的、合乎逻辑的提交。工具应该是灵活的,可以做困难的工作,这样人类就不必这样做了,而不是强迫人类做无意义的工作来安抚工具。您可以向构建系统添加预构建步骤,以提取注释并将提交拆分为单独的文件,这些文件一次构建一个(如果需要),而不是拆分存储库中的工作。通常,所有关于如何以及在何处构建的困难决策都应在构建系统中处理,而不会影响提交工作流。

如果您绝对必须执行此类操作,则可以编写自己的工具,方法是使用临时文件将单个更改读取到索引中,并使用 和更新临时索引,然后使用 编写树,最后使用 创建提交。这些是适合编写脚本的工具,但它们的级别非常低。 不打算编写脚本,因为它是一个瓷器命令。GIT_INDEX_FILEgit read-treegit update-indexgit write-treegit commit-treegit commit

如果采用此方法,则可能需要在 CI 系统中强制执行提交工作流,以便用户不会意外编写包含多个文件的提交。

评论

0赞 Thomas McQuitty 10/3/2023
我一点也不反对你的看法。但是,这是我无法控制的事情,所以只是试图找到解决方案。我最终可能会建议他们一个接一个地提交。谢谢你的信息。