Git:如何从索引中删除文件而不从任何存储库中删除文件

2024-01-01

当你使用

git rm --cached myfile

它不会从本地文件系统中删除,这是目标。但是,如果您已经对文件进行版本控制并提交,将其推送到中央存储库,并在使用该命令之前将其拉入另一个存储库,则它将从该系统中删除该文件。

有没有办法只从版本控制中删除文件而不从任何文件系统中删除它?

编辑:澄清,我希望。


我不认为 Git 提交可以记录像“停止跟踪此文件,但不删除它”这样的意图。

实现这样的意图将需要在 Git 外部对任何合并(或变基)删除文件的提交的存储库进行干预。


保存副本、应用删除、恢复

最简单的方法可能是告诉下游用户保存文件的副本,提取删除内容,然后恢复文件。 如果他们通过 rebase 拉取并对文件进行“携带”修改,则会发生冲突。要解决此类冲突,请使用git rm foo.conf && git rebase --continue(如果冲突的提交除了已删除的文件之外还有其他更改)或git rebase --skip(如果冲突的提交仅更改为已删除的文件)。

拉取删除文件的提交后将文件恢复为未跟踪状态

如果他们已经拉取了您的删除提交,他们仍然可以使用以下命令恢复文件的先前版本git show http://www.kernel.org/pub/software/scm/git/docs/git-show.html:

git show @{1}:foo.conf >foo.conf

Or with git 结账 http://git-scm.com/docs/git-checkout(根据 William Pursell 的评论;但请记住将其从索引中重新删除!):

git checkout @{1} -- foo.conf && git rm --cached foo.conf

如果他们在拉出您的删除后采取了其他操作(或者他们正在将 rebase 拉入分离的 HEAD),那么他们可能需要除@{1}。他们可以使用git log -g在他们删除您的删除之前找到提交。


在评论中,您提到要“取消跟踪但保留”的文件是运行软件所需的某种配置文件(直接从存储库中)。

将文件保留为“默认”并手动/自动激活它

如果继续在存储库中维护配置文件的内容并非完全不可接受,您也许可以将跟踪文件重命名为(例如)foo.conf to foo.conf.default然后指导您的用户cp foo.conf.default foo.conf应用重命名提交后。 或者,如果用户已经使用存储库的某些现有部分(例如脚本或由存储库中的内容配置的其他程序(例如Makefile或类似))要启动/部署您的软件,您可以将默认机制合并到启动/部署过程中:

test -f foo.conf || test -f foo.conf.default &&
    cp foo.conf.default foo.conf

有了这样的默认机制,用户应该能够拉取重命名的提交foo.conf to foo.conf.default无需做任何额外的工作。 此外,如果您将来进行其他安装/存储库,您还可以避免手动复制配置文件。

重写历史无论如何都需要手动干预......

如果维护存储库中的内容是不可接受的,那么您可能希望使用类似的方法将其从历史记录中完全消除git filter-branch --index-filter … http://git-scm.com/docs/git-filter-branch。 这相当于重写历史记录,这将需要对每个分支/存储库进行手动干预(请参阅git 变基 manpage http://git-scm.com/docs/git-rebase)。 配置文件所需的特殊处理只是从重写中恢复时必须执行的另一个步骤:

  1. 保存配置文件的副本。
  2. 从重写中恢复。
  3. 恢复配置文件。

忽略它以防止复发

无论您使用什么方法,您可能都希望将配置文件名包含在.gitignore文件存储在存储库中,这样任何人都不会无意中git add foo.conf再次(这是可能的,但需要-f/--force)。 如果您有多个配置文件,您可能会考虑将它们全部“移动”到一个目录中并忽略整个事情(通过“移动”我的意思是更改程序期望找到其配置文件的位置,并让用户(或启动/部署机制)将文件复制/移动到新位置;您显然不希望git mv将文件放入您将忽略的目录中)。

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

Git:如何从索引中删除文件而不从任何存储库中删除文件 的相关文章

  • 交互式变基后,本地 Git 分支已偏离原始分支

    我有一个本地分行 CRM ayrshireminis 其中有一些我已推送到原点的提交 origin CRM ayrshireminis 这个分支是从创建的develop大约一周前的一个分支 其他合作者已经在该分支上完成了一周的工作 我想做的
  • 如何使用 .gitattributes 避免在 git root 中包含文件夹,但在 zip 的 dist 文件夹中包含同名文件夹

    我有一个名为lib在存储库的根目录和另一个名为lib在 dist 文件夹中 我正在尝试使用 gitattributes文件排除除 dist 之外的所有文件夹和文件 以便任何下载为 zip 或 tarball 的人都只会 git 分发文件 我
  • git 预提交钩子格式代码 - Intellij/Android Studio

    本要点展示了如何在预提交时使用 Eclipse 格式化程序自动格式化 Java 代码 Source https gist github com ktoso 708972 https gist github com ktoso 708972
  • Git:如何变基到特定提交?

    我想变基到特定的提交 而不是另一个分支的 HEAD A B C master D topic to A B C master D topic 代替 A B C master D topic 我怎样才能做到这一点 您可以通过在您喜欢的提交上创
  • 重新打包存储库对于大型二进制文件有用吗?

    我正在尝试将大量历史记录从 Perforce 转换为 Git 并且一个文件夹 现在是 git 分支 包含大量大型二进制文件 我的问题是运行时内存不足git gc aggressive 我的主要问题是重新打包存储库是否可能对大型二进制文件产生
  • 分支明显不同,但提交历史是相同的

    git status告诉我我的分支和我在另一个存储库上开始的分支已经分歧 On branch master Your branch and origin master have diverged and have 13 and 13 dif
  • git - 更新 fork 的 master 并将我的分支重新建立到它之上?

    我分叉了一个 github 项目 然后将其克隆到本地 然后我在新分支中做了一些更改my github the project repo 然后我添加并提交了更改 并推送到我的 github 存储库并提交了拉取请求 所有者已收到我的请求 并希望
  • git pull,忽略深度,如何不拉取整个历史记录?

    我们有一个巨大的多 GB git 存储库 主要是二进制对象 克隆需要几天时间 实际的主分支 没有历史记录 只有大约 20MB 所以我想 深度为 1 的 git 克隆就是解决办法 然而 现在我需要将某人的更新拉到主服务器 我们没有分支 当我拉
  • Git:显示分支之间的差异,忽略合并的提交

    我的存储库历史记录看起来像这样 x y z branch a b c d e master 我想获得 branch 完整历史记录的单个差异 即 像 git diff 输出 我不想要像 git log p 产生的一大堆差异 而不包括任何从 m
  • 在 github 上的 fork 中跟踪上游的最佳实践

    摘要 对于要维护一组本地更改的上游存储库 处理长期运行跟踪的最佳实践是什么 我想让 github 上的 fork 与上游保持同步 但仍然允许清晰跟踪 fork 特有的更改 对于本次讨论 假设upstream指向主项目存储库并且origin指
  • 如何将更改移出主分支

    基本问题 但这一直发生在我身上 进行更改working branch 切换到master git merge working branch git push cap deploy 到舞台 泡一杯新茶 然后我回来思考其他事情并开始做出一些改变
  • git reset 命令中的 ~1 是什么意思?

    git 重置 HEAD 1 我的印象是 1 的意思是 从 HEAD 开始 遵循 1 链接 并将 HEAD 标签设置为新的提交节点 我正期待着 git 重置 HEAD 2 跟随 2 个链接 然后设置 HEAD 标签 但是 如果我尝试它 我会收
  • git 显示已添加到 gitignore 的文件中的更改?

    我已经将 log2 文件夹和 main js 文件添加到 gitignore 如屏幕截图所示 但即使执行后git rm cached r我仍然可以看到 git 正在检测 main js 和 log2 文件夹内文件的更改 怎么会 这些的常见问
  • 格里特:! [远程拒绝] HEAD -> refs/publish/master (没有新的更改)

    我做了一些更改 提交了它们并将分支推送到 Gerrit git push gerrit 现在我的更改没有出现在 Gerrit 中 我认为这是因为我手动推送更改而不是使用git 审查 https github com openstack in
  • .gitconfig 别名函数调用

    我在 gitconfig 中定义了以下别名 alias teamcity tc tc是我在我的中定义的一个shell函数 bashrc文件 由于某种原因 我收到以下错误 aafghani 03 git workday amirafghani
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • git 日志历史记录图,每次提交一行,彩色,带有日期

    我需要的格式如下 git log decorate graph oneline date order 但我也需要它 包含日期 短 具有相同的颜色 I tried git log decorate graph oneline date ord
  • GIT:以下未跟踪的工作树文件将被签出覆盖

    我有两个分支 一个称为 master 另一个称为 dev 我目前位于 master 分支 我想转到 dev 分支将文件移动到开发服务器 但是当我执行 git checkout dev 我收到消息 以下未跟踪的工作树文件将被覆盖 查看 pag
  • 如何使用 AWS Lambda 安装 Git?

    我在代码提交存储库中有代码 我正在编写一个 lambda 函数来为代码提交存储库的每个签入 事件 构建代码 我无法安装 git 因此无法克隆存储库 我该怎么办呢 正如其他人提到的 在 lambda 上安装 git 要么非常困难 要么完全不可
  • git 提交错误:检测到大文件

    您好 我正在为 ios 8 1 开发一个应用程序 xcode 我已经使用 googleMaps 框架来实现自动完成功能 当我尝试在 Git 中推送我的项目时 我收到大文件检测错误 后来尝试使用 git lfs 并跟踪 git 检测到的文件

随机推荐