对于修改分阶段文件的预提交钩子,我需要弄清楚钩子运行后必须暂存的内容.
预提交钩子对应该提交的文件应用一些漂亮的打印.钩子执行以下任务:
标有*)的操作是导致下述问题的操作.
完成这些操作后,钩子会将修改后的文件添加到索引中git add $filename
.这样,整个文件上演了,我不再只能提交修改后的文件的一小部分(即帅).
当然,我可以git add --no-verify
绕过钩子,但是当使用时,该选项不可用git gui
.此外,我希望在文件的分段行上应用漂亮的打印,所以绕过钩子不是我的目标.
有没有办法找出在应用漂亮打印后必须添加到索引中的内容,这样我可以在挂钩运行后播放正确的内容而不是暂存整个文件?
编辑1:
虽然David Brigada提供的答案看起来很有希望,但它不起作用:保持分阶段的变更完整(这是好的部分),但(至少在msysgit上)它将所有更改放入存储(不仅是未分级的)那些).当将存储重新弹回WC时,这会导致合并冲突,因为可能会修改分段行.git stash --keep-index
编辑2:David
的更新答案也没有成功,因为git拒绝将存储合并到脏WC中.
编辑3:来自larsks
的回答指出了我的用法.在第一眼看来,这似乎是正确的,但我发现签入的版本是通过过滤器运行并且WC与签入版本不同,这让我很困惑.至少,这是我的经验,并得到Git Book中以下评论的支持:.gitattributes
如果您提交这些更改并再次签出该文件,您会看到正确替换关键字
我必须删除该文件,然后再次检查以查看过滤器应用的更改?没门!还有什么提示吗?
我正在使用 GitKraken (不确定是否相关),当我尝试提交时,我收到以下错误消息:
当我按下“查看挂钩输出”按钮时,我得到以下信息:
预提交
husky > npm run -s 预提交(节点 v8.9.4)[?25l
npm > 运行 src/**/*.js 的任务
\ 纱线格式 git add (...这两行很多...)
\ 纱线格式 git add
“纱线格式”发现一些错误。请修复它们并再次尝试提交。纱线运行 v1.6.0 $ prettier-standard './src/**/*.js' C:\mypath\myfile.js info[访问 [0;1mhttps://yarnpkg.com/en/docs/cli/run有关此命令的文档。
prettier-eslint [错误] 由于 eslint 错误,eslint 修复失败 prettier-standard [错误] 格式化“C:\mypath\messages.js”时出现错误:TypeError:无法读取 null 属性“范围”
at SourceCode.getTokenBefore (c:\mypath\index.js:303:18)
at checkSpacingBefore (C:\mypath\template-curly-spacing.js:52:42)
at TemplateElement (C:\mypath\template-curly-spacing.js:117:17)
at listeners.(anonymous function).forEach.listener (C:\mypath\safe-emitter.js:47:58)
at Array.forEach (<anonymous>)
at Object.emit (C:\mypath\safe-emitter.js:47:38)
at NodeEventGenerator.applySelector (C:\mypath\node_modules\eslint\lib\utilode-event-generator.js:251:26)
at NodeEventGenerator.applySelectors (C:\mypath\node_modules\eslint\lib\util\node-event-generator.js:280:22)
at NodeEventGenerator.enterNode (C:\mypath\node-event-generator.js:294:14)
at CodePathAnalyzer.enterNode (C:\mypath\code-path-analyzer.js:608:23)
at Traverser.enter [as _enter] …
Run Code Online (Sandbox Code Playgroud) 我开始使用 Prettier + eslint 使用pretty-quick
& husky
(选项 2)。它的行为符合预期,即在提交(或修改)期间重新格式化代码并包含提交中的更改。
我的 monorepo 需要(几个)更多的预提交钩子,所以我最终迁移到pre-commit.com(选项 3)。现在,当我提交或修改时,Prettier 会修改文件并返回Failed
状态。这造成了一个相当烦人的工作流程,我被迫添加文件并尝试再次提交更改。
有什么方法可以将更改重新暂存为提交的一部分吗?
我在预提交和黑色方面遇到了麻烦。
一切工作正常,直到我用 清除缓存pre-commit clean
。现在我总是收到错误
该挂钩
black
需要预提交版本 2.9.2,但已安装版本 2.6.0。也许运行`pip install --upgrade pre-commit
如果我检查我的版本,我正在运行最新的预提交版本 (v2.12.1)。另外,如果我运行推荐的命令,则不会发生任何变化,并且会出现相同的错误。如果我停用black
挂钩,错误就会消失,所以我至少知道这是黑色的问题。
我尝试将黑色版本更改为stable
最新版本,但没有任何帮助。
我有什么想法可以解决这个问题吗?
我的预提交配置:
- repo: https://github.com/ambv/black
rev: stable
hooks:
- id: black
language_version: python3.8
exclude: |
(?x)(
migrations/|
config/|
_build/|
buck-out/|
build/|
dist/
)
Run Code Online (Sandbox Code Playgroud)
非常感谢帮助
我们使用预提交来使用黑色格式化我们的 Python 代码,并在以下配置中进行配置.pre-commit-config.yaml
:
repos:\n - repo: https://github.com/ambv/black\n rev: 20.8b1\n hooks:\n - id: black\n language_version: python3.7\n
Run Code Online (Sandbox Code Playgroud)\n由于我们的包在不同的 Python 版本(例如,,3.7
)中进行测试和使用,我希望能够在不同的 Python 版本上使用预提交 Hook。但是,当在 Python 上提交代码时,由于我的配置(见上文),我收到错误:3.8
3.9
3.8
language_version
C:\\Users\\FooBar\\Documents\\Programmierung\\foo (dev -> origin)\n\xce\xbb git commit -m "Black file with correct black version"\n[INFO] Initializing environment for https://github.com/ambv/black.\n[INFO] Installing environment for https://github.com/ambv/black.\n[INFO] Once installed this environment will be reused.\n[INFO] This may take a few minutes...\nAn unexpected error has occurred: CalledProcessError: command: (\'c:\\\\users\\\\FooBar\\\\anaconda\\\\python.exe\', \'-mvirtualenv\', …
Run Code Online (Sandbox Code Playgroud) 我将此添加到pre-commit-config.yml
- repo: local
hooks:
- id: python-hook
name: python-hook
entry: python python_script.py
language: python
pass_filenames: false
Run Code Online (Sandbox Code Playgroud)
哪里python_script.py
有以下内容
#!/usr/bin/env python
import os
print(os.environ["VIRTUAL_ENV"])
import requests
Run Code Online (Sandbox Code Playgroud)
该软件包requests
安装在活动虚拟环境中,当我运行预提交时,我得到以下输出
/path/to/home/.cache/pre-commit/repouecs3sp4/py_env-python3.7
Traceback (most recent call last):
File "python_script.py", line 7, in <module>
import requests
ModuleNotFoundError: No module named 'requests'
Run Code Online (Sandbox Code Playgroud)
这里的问题是虚拟环境的路径显然被切换到了不同的路径/path/to/home/.cache/pre-commit/repouecs3sp4/py_env-python3.7
。
我在这里缺少什么吗?感谢您的帮助
我在大多数 Python 项目中使用预提交,并且在其中许多项目中,我需要使用 pylint 作为本地存储库。当我想要提交时,我总是必须激活 python venv 然后提交;否则,我会收到以下错误:
black....................................................................Passed
pylint...................................................................Failed
- hook id: pylint
- exit code: 1
Executable `pylint` not found
Run Code Online (Sandbox Code Playgroud)
当我使用vscode版本控制提交时,我得到同样的错误;我搜索了这个问题,但没有找到任何解决方案来避免 VSCode 中的错误。
这是我的典型.pre-commit-config.yaml
:
repos:
- repo: https://github.com/ambv/black
rev: 21.9b0
hooks:
- id: black
language_version: python3.8
exclude: admin_web/urls\.py
- repo: local
hooks:
- id: pylint
name: pylint
entry: pylint
language: python
types: [python]
args:
- --rcfile=.pylintrc
Run Code Online (Sandbox Code Playgroud) python pre-commit pre-commit-hook visual-studio-code pre-commit.com
毒物:https: //tox.wiki/en/latest/
我想了解这两种选择的界限。
我知道预提交会创建一个 py 环境 - 与 tox 相同。对我来说,他们的架构看起来有点相似。
有些人将它们结合使用...... pre-commit 不能做什么,tox 可以?我看到了一些示例,其中通过 CI 管道期间的预提交,您可以运行单元测试等。
哪一个最适合集成到 CI 构建中?
我在运行“pre-commit run --all-files”时收到以下错误,并且在尝试提交时出现以下错误,这是一些 python 错误,使用的 python 版本是“Python 2.7.16”。
\n[INFO] Installing environment for https://github.com/pre-commit/mirrors-mypy.\n[INFO] Once installed this environment will be reused.\n[INFO] This may take a few minutes...\nAn unexpected error has occurred: CalledProcessError: command: ('/Users/user/.cache/pre-commit/repoq_mv31g8/py_env-default/bin/python', '-mpip', 'install', '.', 'tokenize-rt==3.2.0', 'pydantic')\nreturn code: 1\nexpected return code: 0\nstdout:\n Processing /Users/user/.cache/pre-commit/repoq_mv31g8\n Preparing metadata (setup.py): started\n Preparing metadata (setup.py): finished with status 'done'\n Collecting tokenize-rt==3.2.0\n Using cached tokenize_rt-3.2.0-py2.py3-none-any.whl (6.1 kB)\n Collecting pydantic\n Using cached pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl (2.4 MB)\n Collecting mypy==0.782\n Using cached mypy-0.782-py3-none-any.whl (2.4 MB)\n Collecting mypy-extensions<0.5.0,>=0.4.3\n …
Run Code Online (Sandbox Code Playgroud) 我最近从我的环境中卸载了预提交。我在 pipelinev 中执行了以下操作:
pipenv --rm
<deleted Pipfile and Pipfile.lock>
pipenv install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)
我确保预提交模块不再位于requirements.txt 中。当我进行 git 提交时,我得到:
~/my_project/.venv/bin/python: No module named pre_commit
Run Code Online (Sandbox Code Playgroud)
这阻止了我提交,而且我不知道这是从哪里来的,因为未安装预提交。此外,指定的回溯路径指向 python 而不是 python3。我缺少什么?