“git commit”出现意外行为。当预提交挂钩修改暂存文件时

2023-12-05

在我的经验中git commit -a具有等同的行为git commit .但是,最近我创建了一个预提交挂钩,可以自动格式化我的源代码,现在git commit .有一些意想不到的副作用:提交命令完成后,提交的文件最终会在工作目录和索引中被修改。这不会发生在git commit -a。我试图了解跑步时幕后发生的事情git commit .这导致了这种情况的发生,看看是否有办法在我的预提交挂钩脚本中正确处理它。

预提交挂钩:

git_toplevel=$(git rev-parse --show-toplevel)

git --no-pager diff -z --cached --name-only --diff-filter=ACMRT | $git_toplevel/meta/reformat.bash -s files
git --no-pager diff -z --name-only --diff-filter=ACMRT | xargs -0 --no-run-if-empty git add

目前使用 git 版本 1.8.3.1,但我在较新的版本中看到相同的行为。

以下是在行首添加简单空格的命令序列:

[]$ git status
# On branch eroller/format-clean-filter
# Your branch is ahead of 'origin/eroller/format-clean-filter' by 1 commit.
#   (use "git push" to publish your local commits)
#
# 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:   src/host/cnv/denovo/denovo_cnv.cpp
#
no changes added to commit (use "git add" and/or "git commit -a")

-

[]$ git diff
diff --git a/src/host/cnv/denovo/denovo_cnv.cpp b/src/host/cnv/denovo/denovo_cnv.cpp
index 7cfb8dc..14058e3 100644
--- a/src/host/cnv/denovo/denovo_cnv.cpp
+++ b/src/host/cnv/denovo/denovo_cnv.cpp
@@ -28,7 +28,7 @@ using namespace std;
 namespace cnv {
 namespace denovo {

-SegmentsBySample LoadCallsForSamples(const vector<string>& callFiles, const ReferenceDictionary& reference)
+ SegmentsBySample LoadCallsForSamples(const vector<string>& callFiles, const ReferenceDictionary& reference)
 {
   function<SegmentsBySample::value_type(const string&)> loadCalls = [&](string callFile) {
     return LoadCalls(callFile, reference);

-

[]$ git commit -m 'test' .

-

[]$ git status
# On branch eroller/format-clean-filter
# Your branch is ahead of 'origin/eroller/format-clean-filter' by 2 commits.
#   (use "git push" to publish your local commits)
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   src/host/cnv/denovo/denovo_cnv.cpp
#
# 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:   src/host/cnv/denovo/denovo_cnv.cpp
#

-

[]$ git diff
diff --git a/src/host/cnv/denovo/denovo_cnv.cpp b/src/host/cnv/denovo/denovo_cnv.cpp
index 14058e3..7cfb8dc 100644
--- a/src/host/cnv/denovo/denovo_cnv.cpp
+++ b/src/host/cnv/denovo/denovo_cnv.cpp
@@ -28,7 +28,7 @@ using namespace std;
 namespace cnv {
 namespace denovo {

- SegmentsBySample LoadCallsForSamples(const vector<string>& callFiles, const ReferenceDictionary& reference)
+SegmentsBySample LoadCallsForSamples(const vector<string>& callFiles, const ReferenceDictionary& reference)
 {
   function<SegmentsBySample::value_type(const string&)> loadCalls = [&](string callFile) {
     return LoadCalls(callFile, reference);

-

[]$ git diff --cached
diff --git a/src/host/cnv/denovo/denovo_cnv.cpp b/src/host/cnv/denovo/denovo_cnv.cpp
index 7cfb8dc..14058e3 100644
--- a/src/host/cnv/denovo/denovo_cnv.cpp
+++ b/src/host/cnv/denovo/denovo_cnv.cpp
@@ -28,7 +28,7 @@ using namespace std;
 namespace cnv {
 namespace denovo {

-SegmentsBySample LoadCallsForSamples(const vector<string>& callFiles, const ReferenceDictionary& reference)
+ SegmentsBySample LoadCallsForSamples(const vector<string>& callFiles, const ReferenceDictionary& reference)
 {
   function<SegmentsBySample::value_type(const string&)> loadCalls = [&](string callFile) {
     return LoadCalls(callFile, reference);

更新:使用 @torek 的非常彻底的答案(谢谢!),如果用户尝试使用,我决定在预提交挂钩中给出错误git commit . or git commit [--only] -- <files>。这是我的预提交脚本中的检查:

if [[ $GIT_INDEX_FILE != *"/index" ]] && [[ $GIT_INDEX_FILE != *"/index.lock" ]] ; then
  echo "Error: pre-commit reformatting using unsupported index file ($GIT_INDEX_FILE)." >&2
  echo "       Are you using 'git commit [--only] -- <files>' to bypass staging?" >&2
  echo "       Use git commit -a or stage your files before committing using git add -- <files>" >&2
  echo "       Use '--no-verify' to bypass reformatting (not recommended)" >&2
  exit 1
fi

这里的根本问题是 Git 不是从工作树而是从索引进行提交,这就是为什么你需要git add首先是文件——但是the索引是一种善意的谎言,因为can be更多的索引文件不仅仅是一个标准文件。 (该指数也称为暂存区 or the cache,具体取决于 Git 的哪一部分正在执行调用。)

The索引,我的意思是一个标准索引,是一个文件.git named index。如果您检查您的.git目录下你会发现这样一个文件。过去,确实只有这一个文件。在现代 Git(2.5 及以上)中,由于添加了工作树,情况变得更加模糊:实际上每个工作树都有一个索引文件,因此.git/index只是the索引为main工作树。有一个辅助the每个工作树的索引——但这并不是我想要表达的意思,这里,这只是一个例子,展示了存在一个索引的假设如何已经在边缘磨损。诚然,您使用的是 Git 1.8.3.1(它确实很旧),但它也比简单的善意的“一个索引”设置更复杂。

当你使用git commit -a, Git 创建一个新的额外索引。当你使用git commit .,你正在调用git commit --only . (详细信息请参阅文档),Git 使得two新的额外索引(索引?)。

Git 的所有部分都能够重定向restGit 使用不同的非标准索引,以及这些不同的选项git commit利用这个功能。注意git commit -a相当于git commit --include后跟需要添加的任何文件的名称。真正棘手的情况是你正在使用的情况,git commit --only.

一旦开始增加索引文件,事情就会变得混乱!

请记住,索引本质上是提议的下一次提交。如果只有一个索引(对于此工作树,如果我们谈论的是 Git 2.5 或更高版本),则只有一个建议的下一次提交。这并不是太难,我们只需要考虑有three每个文件的副本。让我们选择一个文件,例如README.md:

  • HEAD:README.md是当前提交的版本README.md。你无法改变它。 (你可以移动HEAD本身,但是提交的副本README.md位于提交内部,通过提交的哈希 ID 找到,并且不会更改。)

    名字HEAD:README.md只能在 Git 内部工作。该名称访问该文件的冷冻、Git 化、冻干副本;这个副本永远不会改变。你可以看到它git show HEAD:README.md, 例如。

  • :README.md是的副本README.md在索引中。它原本是一样的HEAD:README.md但如果你跑了git add README.md,现在可能有所不同。

    名字:README.md也只能在 Git 内部工作。该名称可访问存储在索引中的可替换但经过 Git 化(冻干格式)的文件副本。您可以随时将其替换为git add.

  • 最后,README.md是一个普通(非 Git 化)文件。它不在 Git 中!它不在索引中!它在你的工作树,您可以使用所有常用的计算机工具查看并处理它。 Git 实际上不会将此文件用于任何用途,它只是在您检查其他提交时覆盖它或删除它。 Git 用它做的唯一一件事就是用它来检查它git status等等,就是让你使用git add to copy它回到索引中,覆盖之前的内容(并在此过程中将其冷冻干燥)。

Running git status运行两个git diffs:

  • 第一个比较HEAD提交到索引,即当前提交中的内容与建议的下一次提交中的内容。任何事物不同的这里被列为暂存以供提交。任何相同的事情,Git 都会默默地什么也不说。

  • 第二git diff将索引与工作树进行比较,即建议提交中的内容与可以复制到索引中的内容。任何事物不同的这里被列为未暂存提交。任何相同的事情,Git 都会默默地保持沉默。

  • (然后最后一步是检查工作树中根本不在索引中的文件。Git 会抱怨这些文件,说它们未被跟踪,除非您将它们列出在.gitignore。被列入.gitignore不会改变索引中是否存在该文件的副本,它只会改变 Git 是否发出呜呜声。)

当你跑步时git commit,Git 打包索引中的所有内容,并使用它来进行新的提交...unless你用--only, --include, or -a.

Indices 出胡事

With git commit --only, Git 使three索引文件:

  • 一种是标准的。一开始就没有动过。这才是正常的.git/index.
  • 一个是那个的副本,带有--only files git add编辑它。在里面.git/index.lock在某一点。Maybe它总是在这里!如果是这样,这将提供一种处理我在下面概述的情况的方法。但没有任何文件可以保证这一点。
  • 第三种是第一次提取出来的新鲜的HEAD, then git adding the --only文件到它。

如果你没有git add任何事物before你跑了git commit -a,第一个和第三个索引文件匹配,因为添加了--only将文件添加到常规索引与从其中创建新的临时索引具有相同的效果HEAD并添加--only文件到它。但否则所有三个文件可能会有所不同!

然后 Git 从third指数。如果新提交成功,Git 会将常规索引替换为second索引(此替换通过rename系统调用)。否则 Git 将返回到正常索引。 (请注意,工作树根本没有发生任何事情。)

如果你使用git commit --include or git commit -a, Git 仅使one额外的索引,这样你就有:

  • 标准指数在.git/index,以及您到目前为止添加的内容;和
  • 临时文件中的额外索引:这作为标准索引的副本开始,但随后 Git 将列出的文件或其他修改的文件添加到该索引。

然后 Git 开始提交过程。如果一切顺利,当 Git 完成时,Git 会重命名临时索引,使其成为标准索引。如果情况不妙,Git 会删除临时索引,而标准索引保持不变。同样,工作树没有任何反应。

引入预提交钩子

Git 在准备好任何额外的索引文件后运行您的预提交挂钩。特殊环境变量$GIT_INDEX_FILE命名 Git 将用于进行新提交的索引。所以有三种情况,其中两种还不错,一种很糟糕:

  • 你正在做一个正常的提交。GIT_INDEX_FILE命名正常索引,一切正常。
  • 你正在做一个git commit --include or git commit -a and GIT_INDEX_FILE命名第二个索引;没有第三个索引;如果提交完成,Git 将重命名第二个索引。
  • 你正在做一个git commit --only and GIT_INDEX_FILE命名第三个索引。没有简单的方法find第二个索引,如果提交成功,该索引将在提交后到位!

如果您选择对存储在索引中的文件进行更改,您的工作就是将它们更改为 Git 用于提交的索引。为此,您可以使用git add如果您愿意,因为这会将文件从工作树复制到名为的索引$GIT_INDEX_FILE.

但第一个问题是你must not查看中的文件工作树。他们是无关紧要的!它们可能包含与索引中完全不同的内容。这期间尤其如此git commit --only.

第二个也是更大的问题是,如果您更新了third索引那个git commit --only正在使用,您还应该更新second索引那个git commit --only正在使用。这部分很棘手,因为除了假设它位于.git/index.lock。虽然这可能有效,但我不会在这里建议这样做。

我真的对此没有什么建议——你发现的任何偷偷摸摸的方法都可能会失败,因为处理第三个索引的代码(当前 2.21 版本的 Git 称之为“假索引”)在 1.8 和现代 Git 之间已经发生了很大的变化。通常的最佳实践建议是not在 Git 挂钩中进行任何特殊格式化。相反,让 Git 挂钩仅仅检查whether文件的索引副本格式正确:如果是,则继续提交,如果不是,则中止提交。剩下的就交给用户吧。

另一种选择

我见过和使用的另一种选择是检查实际设置$GIT_INDEX_FILE。如果设置为.git/index,用户正在使用git commit无需任何特殊设置。另一个技巧这个相同的预提交钩子(调用 clang-format 和 autopep8)是比较要格式化的文件的索引和工作树,如果不匹配则拒绝运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“git commit”出现意外行为。当预提交挂钩修改暂存文件时 的相关文章

  • Git 提交到公共子模块(主分支)

    我有两个或更多项目 我们称它们为Foo项目 and 项目栏 有一些通用代码我放入了一个子模块 我的理解是 如果我从内部提交对子模块的更改Foo项目它将在一个超然的头脑中 只有所有Foo项目克隆人可以看到 master cd ProjectF
  • 致命:未配置推送目的地

    请参阅以下屏幕详细信息 git remote v 命令显示我已添加 test vish 但是当我发出 Push 命令时 它给出了错误 有人可以帮忙吗 C Users vishwas gupta03 Documents GitHub test
  • 我在使用“heroku open”命令时遇到错误

    我在 heroku 上创建了一个 python 应用程序 推动后我给了heroku open命令 我在浏览器上遇到这样的错误 Application Error An error occurred in the application an
  • 在 Windows 上,无法创建目录“/home/<用户名>/.ssh”

    要使用 gitbash 在 Windows 上配置 git 如所解释的here https help github com articles generating a new ssh key and adding it to the ssh
  • GIT Pull 删除了我的提交

    在 git pull 之后 我已经完成了 git Reset 以在合并之前撤消与提交 ID 的合并 不知何故 我的整个提交都消失了 而且我也无法在历史记录中看到该提交 但我有提交 id 在 git show 命令上我可以看到我的更改 我如何
  • 版本控制 rpm 规范文件

    我正在配置一台构建机器来为大量非常相似的项目生成 rpm 每个项目的规范文件在名称上以及有时在依赖项和其他属性上都略有不同 每个项目都有自己的 git 存储库 其中包含项目文件 这些规范文件仅存在并且实际上仅对构建系统本身有用 每个项目都可
  • 如何比较本地 Git 分支与其远程分支

    我怎样才能看到diff本地分支和远程分支之间 git diff
  • 在 GitHub 上看不到“在 Xcode 中打开”按钮

    正如在GitHub 和 Xcode 9 中的新源代码管理工作流程 https developer apple com videos play wwdc2017 405 time 204Apple 视频会话 我们可以直接从 Xcode 克隆项
  • VS Code / Bitbucket / SSH - 权限被拒绝(公钥)

    我试图通过 ssh 从 vscode 访问 bitbucket 但总是得到权限被拒绝 公钥 SSH 密钥位于 ssh 公钥已正确设置在bitbucket settings security sshkeys 按键已经过测试并且可以工作 启动后
  • 分支和文件夹的 gitolite 权限

    在 gitolite 我想要 developers能够推送到除以下之外的任何分支master I want user1能够推送到任何分支 包括master 除了不是某个目录master 我该怎么做呢 这应该解决以下两个问题 repo are
  • Visual Studio 代码中的“Git:gpg 未能签署数据”

    全新安装 Linux 后 我尝试设置我的环境 并且不断收到Git gpg failed to sign the data在本地提交更改时出错 我使用的是 Visual Studio Code 专有版本 而不是开源版本 gitconfig u
  • 如何找出在哪个提交中添加了特定代码?

    我想知道我在哪个提交中添加了下面给出的代码 if getListView getChildCount 0 getActivity findViewById android R id empty setVisibility View VISI
  • dulwich - 从远程仓库身份验证克隆

    我找不到有关此主题的任何资源 我需要通过提供用户名和密码从私有存储库进行克隆 然而 当它们作为关键字参数提供给 dulwich get client from path 时 会出现错误 提示 未知参数 用户名 这似乎是一件简单的事情 但我找
  • 从 svn 到 git,移动了主干

    我正在尝试将 svn 存储库切换到 git 这是一个旧的存储库 以前的维护者之一为每个新版本移动了主干 例如 以前的存储库位于 svn ssh svn mycompany com project release 1 trunk 现在 我们当
  • Git core.safecrlf 对具有相同行结尾的文件有不同的行为

    我有带有 VS 项目的 Windows 计算机 并且使用 Visual Studio 和 Cygwin 环境中的工具 包括 Git 有时 编辑后我会在文件中得到不同的行结尾 我想要简单的解决方案来检查文件的行尾一致性 然后再将其发送到存储库
  • 如何使用 GitLab 管道中的密钥通过 SSH 连接到目标服务器?

    当 GitLab 管道成功时 我想通过 SSH 使用公钥连接到服务器 正如我所看到的 我需要在 GitLab 端使用 ssh keygen 生成一个密钥并将其添加到我想要连接的服务器上 我可以在管道期间生成密钥 但由于公钥未添加到目标服务器
  • Egit 拒绝接受 id_rsa

    我是第一次尝试在 Eclipse 中设置 egit 的 git 用户 这样我就可以继续通过 Eclipse 轻松编码 问题是 每次我尝试通过 egit 克隆存储库时 都会出现错误 无法列出可用分支 原因 ssh 电子邮件受保护 cdn cg
  • 使用可通过 FTP 访问的 Web 服务器进行 Git 托管?

    我运行一个 糟糕的 网站 托管在第三方网络服务器上 我可以通过 FTP 访问我的 Web 服务器 据推测 Git 本身具有通过 FTP 推送 拉取的能力 由于我的 Web 服务器已经可以随处访问 我希望将其用作集中式 Git 存储库 我可以
  • 使用 git 同时维护不同版本的代码

    我有一个需要优化的代码 我想同时维护一组版本的代码 每个版本可以描述为一些功能 优化的组合 最终 我将决定哪个版本是最好的 我不想将这些版本合并为更少的版本 但是 我希望能够对 大 源文件进行 小 修改 这可能会跨版本转移 并且我希望这一修
  • 如何快速查看哪个 Git 分支是最新的?

    例如 如果 git 上有 4 个分支 如下所示 branch1 branch2 current branch branch3 newest commits here master oldest 我的问题是 如何从 git 命令行检查我当前的

随机推荐

  • 为什么在 python 中修改局部变量是个坏主意?

    与此回复相关here 当地人的医生here 文档提到字典不应该改变 不确定它意味着什么 但会locals 适用于数据不会改变的实验室报告 例如测量 文档说的是 当你有本地x变量并做locals x 42 then x可能仍然指向旧对象 de
  • 汇编(Intel 语法 + NASM)错误:尝试在任何非本地标签之前定义本地标签

    我对装配很陌生 我正在尝试使用一个程序 因此 每当我尝试编译它时 我都会收到该行的错误 如代码中注释下所列 我想知道是否有人知道为什么当我为其余的汇编代码定义一些内容时 NASM 会检测到此错误 也许它与 main 的定义方式有关 附 我只
  • 三重存储中的开放世界假设和 SPARQL

    我想知道 SPARQL 默认情况下是否采用开放世界假设 或者这是否取决于执行 SPARQL 查询的三元组存储 这个假设在查询中的含义是什么 此致 Well 我想知道这对于这个网站来说是否真的是一个好问题 我想不会 但无论如何我都会往桶里扔几
  • Java应用程序,具有多个场景

    我正在开发一个 java 项目 我处理了所有功能 但是当涉及到 GUI 时 我是一个初学者 我想知道的是我可以使用java在一个阶段中显示不同的场景 就像在javaFX中一样吗 例如 我的起点是登录面板 登录后清空 Jframe 并显示下一
  • IBM Worklight 6.1 - 错误 TRAS0033E

    这是我第一次使用IBM Worklight 我有关注了这篇文章 但是 当我尝试从以下位置运行 Worklight Development Server 时 Servers view 我收到以下错误 TRAS0033E 详细方法跟踪的运行时注
  • 获取当前前台应用程序的名称

    我需要研究参与实验的一组测试用户实际使用了哪些应用程序 我想知道每个随机的第三方应用程序被用来进行统计的时间 如果可能的话 我计划通过 TestFlight 分发 iOS 应用程序 我的应用程序将收集应用程序使用情况统计信息并将其发送到我的
  • 正则表达式整个单词[重复]

    这个问题在这里已经有答案了 我觉得问这个问题有点傻 但从我读过的所有内容来看 这对我来说应该有效 但事实并非如此 我只是想使用正则表达式来匹配字符串中的整个单词 所以 如果我试图在句子中找到 the 这个词 它应该为 the Quick B
  • Azure Databricks python 命令显示当前集群配置

    我目前正在优化我们的 ETL 流程 并且希望能够看到处理数据时使用的现有集群配置 这样 我可以随着时间的推移跟踪我应该使用哪些工作节点大小 是否有一个命令可以在 python 中返回集群工作线程 和大小 以便我可以将其写入数据帧 您可以通过
  • 在 post 请求中将 JSON 传输到服务器

    服务器有两个参数 String and JSON 提示 正确我转移JSON和 POST 请求中的字符串 try HttpClient httpClient new DefaultHttpClient HttpPost httpPost ne
  • 清理extract_tables条件合并行,系统提取

    这是上一篇文章的后续内容 有条件合并行 我将这 1838 页长的所有表格都数字化了PDF文档使用 extract tables 来自tabulizer包 由于内存问题 我不得不逐页进行 for i in seq 1 1868 Locatio
  • Python Matplotlib 滑块小部件未更新

    我想使用多个包含数据 matplotlib 滑块小部件的 matplotlib 画布 问题是滑块小部件未正确更新 看起来鼠标事件未发送或其他 这就是我所拥有的 import matplotlib matplotlib use TkAgg f
  • 找到所有边的最小最高成本的算法是什么?

    我正在尝试解决一个问题 我需要找到从开始到目标节点的每一步的最小成本 我认为这个算法存在 但我找不到这个算法的名称 在我正在研究的情况下 只有积极的边缘 并且可能存在循环 它不是 dijkstra 的 因为我不是在寻找总的最小成本 而是在寻
  • 使用按钮更改 iPhone 应用程序语言,无需重新启动应用程序

    我想更改我的应用程序的语言 目前我正在按以下方式进行 我有两个按钮可以更改 NSUserDefaults 中的语言 但在这影响我的应用程序之前 我需要重新启动它 这是我的代码 IBAction changeDutch id sender N
  • 编码进度条建议

    在我的应用程序中 我正在解析 xml 文件并使用 xsd 架构验证内容 当 xml 文件变大时 需要一些时间来解析文件并验证内容 在这种情况下 我希望使用进度条可视化解析和验证阶段 这个怎么做 注意 我使用的是 Qt 和 C 基本上你只需创
  • 删除运行时正在使用的文件

    如何删除运行时某个进程正在使用 打开的文件 我在我的项目中使用 vb net 图像显示在图片框中 并且应该删除它 而不关闭该文件 如果该文件被另一个进程以独占模式打开 则您不能 Windows 不允许您这样做 在这种情况下 您能做的最好的事
  • 如何将软件包(例如 libjpeg-dev)自动加载到我的 Elastic Beanstalk 应用程序?

    我有一个运行 Python 的自动缩放 Elastic Beanstalk 应用程序 我想在其中使用 PIL 当我这样做时 它说我的 jpeg 解码器丢失 我需要安装 libjpeg 所以我在这里遵循AWS官方指南的 配置文件 http d
  • 为什么我的大型 JSF 数据表不只在 IE 中填充?

    我正在尝试使用 JSF 中的 HtmlDataTable 动态生成一个表 当我给出的行数和列数均大于 25 时 某些单元格仅在 IE 中不会填充 并且速度变得非常慢 但是 我可以在使用 Firebug 调试代码时看到该值 它在 Firefo
  • 如何在 webdriver (Python) 中打开新窗口或选项卡?

    我尝试过各种命令 例如 driver switch to window blank or driver switch to window None 但这些都不起作用 这应该怎么做 谢谢 经过大量的谷歌搜索后 我发现了 Firefox 中对我
  • 使用 Ruby On Rails 的多个用户模型,并设计有单独的注册路线,但有一个通用的登录路线

    首先 我在谷歌和雅虎上进行了大量搜索 并找到了一些关于我的主题的回复 但它们都没有真正涵盖我需要知道的内容 我的应用程序中有多个用户模型 目前是客户 设计师 零售商 而且似乎还会有更多 他们的表中以及网站上允许或不允许的几个区域中都存储了不
  • “git commit”出现意外行为。当预提交挂钩修改暂存文件时

    在我的经验中git commit a具有等同的行为git commit 但是 最近我创建了一个预提交挂钩 可以自动格式化我的源代码 现在git commit 有一些意想不到的副作用 提交命令完成后 提交的文件最终会在工作目录和索引中被修改