- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在研究一个预提交 Hook 来重新格式化代码,一般来说,它是有效的;它重新格式化并 git add
任何暂存文件,并且生成的提交包含所需的重新格式化的代码。
但是,它不能很好地与 git commit --only
(这是 JetBrains IDE 使用的变体)一起使用,我正在尝试理解原因。 git commit --only
和 pre-commit Hook 的组合会导致不希望的索引/工作树状态,如以下事件序列中所述:
如果我对文件进行了一些小的更改,但出现格式错误,然后运行 git status
,这就是我看到的:
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: file.php
no changes added to commit (use "git add" and/or "git commit -a")
如果我随后使用 git commit --only -- file.php
提交,预提交 Hook 将运行,并提交更改和重新格式化的 file.php
.
但是,如果我再次运行 git status
,结果如下(我的箭头注释):
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: file.php <-- contains original change, improperly formatted
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: file.php <-- contains original change, properly formatted (per the most recent commit)
新的阶段性变化和工作树的变化来自哪里?
有人能准确解释 git commit --only
是如何与索引交互以产生上面显示的结果的吗——更好的是,是否有办法让我的预提交钩子(Hook)与它很好地配合?
我的理解是 git commit --only
与工作树中的文件版本一起工作,所以我尝试从预编译中删除 git add
步骤commit hook 看看会发生什么,它导致提交格式不正确的文件版本和工作树中格式正确的版本(这符合我对标准 git commit
的期望,但我不确定在 git commit --only
的上下文中会发生什么。
我知道可以使用 clean
过滤器来重新格式化代码,而不是使用预提交 Hook ,但是这种方法会带来一些复杂的情况,这会很好尽可能避免。
注意:这个问题与Phpstorm and pre commit hooks that modify files有关但专注于解决 git commit --only
上下文中的问题。此外,JetBrains 似乎并未解决该问题,正如该问题的公认答案中所建议的那样。
最佳答案
确切的细节因 Git 的一个版本而异,有些人——我并不是说 JetBrains 的人就在其中,因为我不知道——试图绕过 Git 做事的方式和过程,把事情搞砸了,以至于它们无法解决,或者解决方法取决于 Git 版本。然而,这些 Git 钩子(Hook)的主要思想都是一样的:
当你第一次运行 git commit
时,这两个不需要同步,如果你将文件添加到 git commit
命令,使用 --only
或 --include
,Git 必须创建一个新 索引,该索引可能不同于常规的普通索引。所以现在我们结束了一个环境变量,GIT_INDEX_FILE
,设置为一个新的临时索引的路径。1 因为所有 Git 命令自动遵守环境变量,pre -commit hook 将使用临时索引的文件,git write-tree
将使用临时索引的文件。
当然,任何未能尊重临时索引的东西——或者,可能取决于--include
vs --only
,只使用工作树的内容——会得到错误的答案。
但是,即使程序确实尊重环境变量,仍然存在一个问题。假设我们有一个文件——我们称它为 test
因为这是它的目的——它最初包含“headvers”,并且匹配当前的 (HEAD
) 提交。现在我们在工作树中修改它以包含“indexvers”并运行 git add test
。 test
的索引版本因此显示为“indexvers”。现在我们在工作树中再次修改它,以包含“workvers”,然后运行 git commit --only test
或 git commit --include test
。
我们确切地知道新提交中应该包含什么:它应该是包含 workvers
的测试版本,因为我们明确告诉 Git 提交工作树版本。但是之后应该在索引和工作树中留下什么?这是否取决于我们使用的是 --include
还是 --only
?我不知道在这里考虑什么是“正确”答案!我只能告诉你的是,当我之前尝试使用 Git 时,它倾向于在之后包含 workvers
(在索引和工作树中)。也就是说,临时索引的版本变成了普通索引的版本,工作树文件没有被修改。
(如果你有操纵索引和/或工作树的 Git 钩子(Hook),你将能够 pry 开“将索引复制到保存的索引,然后复制回来”与“将索引复制到临时索引”之间的区别, 然后使用 temp-index".)
1这是我一次测试各种行为时的实际实现,但实际实现可能会发生一些变化。例如,Git 可以将“普通”索引保存在一个临时文件中,然后替换普通索引,这样 GIT_INDEX_FILE
毕竟不 设置。同样,它可能取决于 --include
与 --only
。
请注意 git commit -a
也可能使用临时索引,也可能不使用。我相信这种行为在 Git 1.7 和 Git 2.10 之间发生了变化,基于在另一个窗口中运行 git status
而仍在运行 git commit -a 的窗口中编辑提交消息的结果
。
关于git - 理解 git commit --only 和 pre-commit 钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41401296/
内的和
看似不可能完成的任务。我有一个服务器输出,其中包含 内的转储。不幸的是,我碰巧转储了一个包含一些 html 标签的文件。我需要转换任何内部 HTML 实体,以便当我将数据附加到 DOM 时结构不会
标签之间的所有内容
我正在读取 .html 文件: const htmlin = String(fs.readFileSync(inputHtml) || ''); const splitted = htmlin.spl
我在 中输入了一些文本, 我输入了一些换行符、空格等。故意。但是,在提交文本并在 内呈现之后, 换行符,空格消失了,它们被类似 \r\n\r\n 的东西所取代, 怎么了?如何保持原始格式? 我
我在里面有很多内容我正在打印的标签。我正在对打印样式使用媒体查询。一切都很好,只是第一页的最后一行被剪切了。其中一半保留在第一页,另一半显示在下一页。我不知道如何将溢出转移到下一页。 最佳答案 我想通
并用括起来是否安全?
一些用户生成的文本(可能包含脚本/代码)将向公众展示。如果我过滤掉所有 和标记并用 将结果文本括起来和 ,用户提交的脚本有机会被执行吗? 请给我一个如何破解这个保护方案的例子。 最佳答案 Is it
标签中移除
我制作了简单的 BBCode 脚本,它运行良好。但后来我使用 javascript 库来美化我在 中的代码. 现在我面临的唯一问题是 中每行代码后的标签标签。 所以问题是我怎样才能删除 在
`中删除 ``?
Markdown 中的三个反引号渲染为 ... 。更具体地说, # in markdown ```java ``` # render as ... # my expecting result
标签内的方括号 (<>) 替换除标签内的换行符
我使用 question 中提供的答案替换了 pre 标签外的所有换行符. \n(?![^) 它工作正常,直到 pre 标签中的内容有 括号。 例如,输入: Test contennt for re
标签中获取选定的文本和文本索引,其中偏移量是 pre 的开始
所以我有一个像这样的前置标签: Some content, more content. Coloured content. Some more content 我想做的是使用绑定(bind) mou
我正在开发一个 android 项目,我们在其中使用 ant 构建我们的版本。在更改代码中的 versionName 和其他一些标志时,我们使用 Android-ant 目标 -pre-compile
"); ..... 回显 (""); ?> 是什么意思?
问题是标签 我看过我正在编写的一个脚本,并使用了它: echo (""); ........ echo (""); 它到底做了什么? 它是 Html 标签还是 PHP? 我在 Google 上进行了
我想知道哪些语言和工具(调试器、IDE、分析器、库等)可供想要为 Palm Pre 开发的人使用。 另外,我想知道存在哪些必须注意的技术限制。 最佳答案 有一个 JavaScript 函数库,用于与基
我目前有一个简单的 pre-commit 钩子(Hook)用于我的项目(在 R 中,虽然这是这个问题的附带),它运行单元测试: #!/bin/sh a=$(Rscript tests/testthat
我目前有一个简单的 pre-commit 钩子(Hook)用于我的项目(在 R 中,虽然这是这个问题的附带),它运行单元测试: #!/bin/sh a=$(Rscript tests/testthat
标签中的文本的空白缩进,不包括文档中标签的当前缩进级别?
我试图在网站上显示我的代码,但在正确保留空格缩进时遇到问题。 例如给定以下片段: Here is my code: def some_funtion ret
"的快捷方式 ;print_r($myarray);echo "";
是否有快捷方式 echo ""; print_r($myarray); echo ""; 为了获得数组的可读格式而键入这些内容真的很烦人。 最佳答案 这是最短的: echo '',print_r
我有一个简单的 python 项目,目前只有一个文件。它存在于我的项目的 static/cgi-bin 文件夹中。目前,在我的目录的底部,我有一个 .pre-commit-config.yaml 文件
Moses Tokenizer是广泛应用于机器翻译和自然语言处理实验的分词器。 有一行正则表达式检查: if (($pre =~ /\./ && $pre =~ /\p{IsAlpha}/) ||
在我的一个 PHP 网站上,我需要为我的用户提供选择某些行以从网站上的所有搜索结果(查询)中排除的功能。 我应该采取哪种方式来处理排除,我应该: 1) 每当用户登录(或通过查询更新它)时,预编译排除行
考虑以下代码段。 <p class="text-centre"> </bHello World></b> </p> 然后我有另一个div如下 正如您在第一个 div 中
我是一名优秀的程序员,十分优秀!