【问题标题】:A file seems to still be tracked after running `git update-index --assume-unchanged <file>`运行 `git update-index --assume-unchanged <file>` 后似乎仍会跟踪文件
【发布时间】:2021-07-08 18:13:14
【问题描述】:

我在本地目录中运行了命令git update-index --assume-unchanged .\src\main\resources\application.properties,正如我所料,application.properties 文件从 VS Code 中Source ControlChanges 部分消失了。

但是,差异仍然显示红色删除和绿色添加,就好像文件仍在被跟踪一样。

我也阻止切换分支,因为“更改会覆盖该文件”

任何想法为什么会发生这种情况?我想在我的远程存储库中有一个基本版本,我可以在本地更改而不跟踪更改。

我看到了--skip-worktree 选项并尝试了git update-index --skip-worktree .\src\main\resources\application.properties,但得到了相同的结果。

这是 git 命令和输出

PS C:\r\Body-Tracking-Uploader> git update-index --assume-unchanged .\src\main\resources\application.properties
PS C:\r\Body-Tracking-Uploader> git status
On branch upload-exerciseInfo-aws
Your branch is up to date with 'origin/upload-exerciseInfo-aws'.

nothing to commit, working tree clean
PS C:\r\Body-Tracking-Uploader> git branch
  main
* upload-exerciseInfo-aws
PS C:\r\Body-Tracking-Uploader> git checkout main
error: Your local changes to the following files would be overwritten by checkout:
        src/main/resources/application.properties
Please commit your changes or stash them before you switch branches.
Aborting
PS C:\r\Body-Tracking-Uploader>

【问题讨论】:

  • 我认为问题在于您已指示 git 不在乎对文件本地进行的更改....但是,这并不排除其他人其他 repos 提交对所述文件的更改....所以,现在 git 告诉您,如果您签出,您对文件的 local 更改将被来自另一个分支的更改覆盖.总而言之,为了不破坏您的本地更改,它的行为非常符合预期。
  • 从技术上讲,当且仅当文件在 Git 的索引中时,文件才会被跟踪。要设置标志(假设未更改或跳过工作树),文件必须在 Git 的索引中:标志是该文件的索引条目的一部分。所以当然文件仍然被跟踪。你需要它!

标签: git github git-assume-unchanged


【解决方案1】:

您正在寻找一种方法来忽略对跟踪文件的更改,而您尝试过的两个选项都不起作用的原因是 Git 不支持它,如 outlined in the Git FAQ

Git 没有提供执行此操作的方法。原因是如果 Git 需要覆盖这个文件,例如在结帐期间,它不知道对文件的更改是否宝贵并且应该保留,或者它们是否无关紧要并且可以安全地销毁。因此,它必须采取安全路线并始终保护它们。

尝试使用 git update-index 的某些功能是很有诱惑力的,即假设不变和跳过工作树位,但这些功能不能正常工作,因此不应该以这种方式使用。

如果您正在寻找一种方法来处理配置文件中的配置,这就是您正在做的事情,那么常见问题解答概述了如何做到这一点:

如果您的目标是修改配置文件,将文件签入存储库通常会很有帮助,该文件是一个模板或一组默认值,然后可以在旁边复制并根据需要进行修改。这第二个修改过的文件通常会被忽略以防止意外提交。

【讨论】:

    【解决方案2】:

    我不完全确定问题出在哪里,但我采取了以下步骤

    1. 将 application.properties 的内容复制到单独的位置
    2. 已还原 application.properties 以匹配远程版本
    3. 提交/推送与我目前的进度相关的所有代码更改
    4. 将此功能分支合并到 main 中(它的功能还不完整,但仍处于当前状态)
    5. 在远程存储库中从main 创建了一个新功能分支(以继续之前的 WIP 功能)
    6. 将最新的main 拉到我的本地
    7. git update-index --skip-worktree .\src\main\resources\application.properties
    8. 签出新创建的功能分支
    9. 恢复了对 application.properties 文件的本地更改

    现在更改不会显示在源代码管理视图中,它们不会阻止我在本地分支之间移动。

    【讨论】:

      猜你喜欢
      • 2013-06-16
      • 2018-03-03
      • 2013-04-27
      • 2011-08-31
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多