1

我可以在命令行上通过 ant 很好地运行 checkstyle。不幸的是,安装了这个pre-commit checkstyle git hook 后,当我尝试通过 git shell 或 cmd 提示进行提交时,我收到以下(示例)错误:

C:\mydirectory\M:0: File not found!
C:\mydirectoryr\:100644:0: File not found!
C:\mydirectory\100644:0: File not found!
C:\mydirectory\5cc4b0103c82b3a661fdc6ff59dc8d1b61a0c40b:0: File not found!
C:\mydirectory\73993b57357353af71a1485cfbaef41e94374b8e:0: File not found!
C:\mydirectory\M:0: File not found!
C:\mydirectory\:100644:0: File not found!
C:\mydirectory\100644:0: File not found!
C:\mydirectory\e7f29d65671ddb488de68b9b5886d24efefe9fd6:0: File not found!
C:\mydirectory\aea31a8e04ae560f2278fb860d1570de0ea41c82:0: File not found!
C:\mydirectory\M:0: File not found!
C:\mydirectory\:100644:0: File not found!
C:\mydirectory\100644:0: File not found!
C:\mydirectory\752c83417a18655b6f6f5ac1f4fe31a2933f0189:0: File not found!
C:\mydirectory\5ed1470dc9d4d8e16c1c34319578609b330aa58b:0: File not found!
C:\mydirectory\M:0: File not found!
C:\mydirectory\:100644:0: File not found!
C:\mydirectory\100644:0: File not found!
C:\mydirectory\4339530856664f202ec1d770d364945d9809e5e9:0: File not found!
C:\mydirectory\ef9f65deaab96aea185f3f5fc2184d5871a5f8ee:0: File not found!

其中“mydirectory”是我的网络应用程序根目录的路径。老实说,我不知道发生了什么。我已经为此工作了几个小时,如果没有足够的信息,请道歉。问你有什么问题,我醒来后会回复你的。提前致谢。

4

1 回答 1

4

我怀疑您复制(剪切和粘贴)示例代码。在此过程中,sed命令中的关键制表符被替换为空格,这是行不通的:它确实需要是一个制表符。

通过提供--name-only获取文件名,可以改进示例挂钩以避免整个空格与制表符的区别,从而完全消除对sed ... | uniq部分的需要。(使用 diff 过滤器仅提取添加或修改的文件也是明智之举,并显式禁用重命名检测:add --diff-filter=AM --no-renameswith --name-only。)但是,即使这样也使示例钩子出现了微妙的错误:

  • 它使用git diff-index(拼写为git-diff-index,大改名前的旧拼写)仅查找在索引中修改的那些文件。这是好的和正确的。
  • 但随后它会在工作树中找到的文件上运行样式检查器。如果工作树文件与索引内容不同,这是错误的;如果他们不这样做,则不需要在第一步中使用的护理。

解决第二个问题有点棘手:它需要:

  1. 将文件的索引版本复制到其他地方,以便样式检查器可以检查它们;或者
  2. 用于git stash --keep-index隐藏工作树版本,用打算提交的版本替换工作树版本。完成此操作后,git diff必须更改命令,并且在运行检查后,可以恢复保存的存储,并根据需要完成或跳过提交。

方法 2 是我见过使用得更频繁的一种,但它需要格外小心,以防在git commit没有任何更改的情况下运行。在这种情况下,该git stash步骤不执行任何操作。此外,还有一个错误,git stash似乎没有人愿意修复。如果您选择方法 2,请参阅此答案

于 2014-07-28T10:35:16.363 回答