【问题标题】:Apply .gitignore on an existing repository already tracking large number of files在已经跟踪大量文件的现有存储库上应用 .gitignore
【发布时间】:2013-11-08 21:29:42
【问题描述】:

我的存储库中有一个现有的 Visual Studio 项目。我最近在我的项目下添加了一个 .gitignore 文件,我假设它告诉 Git 忽略文件中列出的文件。

我的问题是所有这些文件都已被跟踪,据我所知,Git 不会忽略在将规则添加到该文件以忽略它之前已经跟踪的文件。

建议使用:git rm --cached 并手动取消跟踪它们,但这将花费我永远的时间来逐一检查它们。

我曾考虑删除存储库并重新创建它,但这次存在 .gitignore 文件,但必须有更好的方法来做到这一点。

【问题讨论】:

标签: git gitignore


【解决方案1】:

answer 解决了我的问题:

首先,提交所有未决的更改。

然后运行这个命令:

git rm -r --cached .

这会从索引中删除所有内容,然后运行:

git add .

提交:

git commit -m ".gitignore is now working"

请注意,当您将其推送到存储库并从其他地方拉入仍然跟踪这些文件的状态时,这些文件将被删除

【讨论】:

  • 完美答案!请添加git push origin 以反映远程存储库中的更改。
  • 我开始使用这个答案......它几乎删除了我项目中的所有内容!显然我做错了什么。但我想警告人们不要随便遵循这个建议。
  • 当您删除并重新添加文件时,这是否最终会丢失文件的历史记录
  • 我想知道有多少次提交使用这个.gitignore is now working 消息。 :)
【解决方案2】:
  1. 创建一个 .gitignore 文件,为此,您只需创建一个空白 .txt 文件。

  2. 然后您必须在 cmd 上写入以下行来更改其名称(其中git.txt 是您刚刚创建的文件的名称):

rename git.txt .gitignore

  1. 然后您可以打开文件并写入所有您想永久忽略的未跟踪文件。例如,我的看起来像这样:

    操作系统垃圾文件 [Tt]humbs.db *.DS_Store

    #Visual Studio 文件 *.[Oo]bj *。用户 *.aps *.pch *.vspscc *.vsscc *_我知道了 *_个人电脑 *.ncb *.suo *.tlb *.tlh *.bak *.[Cc]疼痛 *.同类 *。日志 *.lib *.sbr *.sdf .pyc .xml ipch/ 对象/ [Bb]在 [dd]错误/ [Rr]释放/ Ankh.NoLoad

    #工具 _ReSharper*/ .resharper [Tt]est[Rr]结果

    #项目文件 [bb]uild/

    #Subversion 文件 .svn

    办公室临时文件

    ~$*

有一个whole collection of useful .gitignore files by GitHub

  1. 一旦你有了这个,你需要像任何其他文件一样将它添加到你的 git 存储库中,只是它必须位于存储库的根目录中。

  2. 然后在你的终端中你必须写下以下行:

    git config --global core.excludesfile ~/.gitignore_global

来自官方文档:

你也可以创建一个全局的 .gitignore 文件,它是一个规则列表 用于忽略计算机上每个 Git 存储库中的文件。为了 例如,您可以在 ~/.gitignore_global 创建文件并添加一些 规则。

打开终端。在终端中运行以下命令:git config --global core.excludesfile ~/.gitignore_global

如果存储库已经存在,那么您必须运行以下命令:

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

如果第 2 步不起作用,那么您应该编写要添加的文件的孔路径。

【讨论】:

  • @Karen_Wiznia "git config ... _global" 为计算机上的所有 Git 存储库创建一个全局 gitingore。 OP 不想这样做。
  • 我希望我能不止一次喜欢这个,我不断地回到这个问题寻求这个提醒。
  • 应该是“mv git.txt .gitignore”而不是“rename git.txt .gitignore”。
【解决方案3】:

指定here可以更新索引:

git update-index --assume-unchanged /path/to/file

这样做,文件将不会显示在git statusgit diff

要再次开始跟踪文件,您可以运行:

git update-index --no-assume-unchanged /path/to/file

【讨论】:

  • 这是更好的答案 - 它只关注单个文件,即您不想被存储库跟踪的文件。最高标记的答案也可以,但它不仅仅是忽略 git 跟踪的文件。
  • 这个不错。但是如果我们拉呢?有没有合并冲突?
  • @pramod,好问题。我不太确定。在精简的测试存储库中尝试一下?
【解决方案4】:

如果你添加.gitignore 太晚了,git 将继续跟踪已经提交的文件。要解决此问题,您始终可以删除不需要的文件的所有缓存实例。

首先,要检查您实际跟踪的文件,您可以运行:

git ls-tree --name-only --full-tree -r HEAD

假设您在 cache/ 之类的目录中发现了不需要的文件,因此,针对该目录而不是所有文件更安全。

所以而不是:

git rm -r --cached .

定位不需要的文件或目录更安全:

git rm -r --cached cache/

然后继续添加所有更改,

git add .

并提交...

git commit -m ".gitignore is now working"

参考:https://amyetheredge.com/code/13.html

【讨论】:

  • 如果您只想删除几个文件,而不是整个存储库,这是最好和干净的答案。我向你竖起大拇指。
  • 谢谢!!!我刚刚升级了。按照描述工作。发出git commit 后,您可以看到受影响的文件,然后它将它们从存储库中删除。完美!
  • 仅供概念理解,假设我没有其他变化,是步骤“git add”。在这种情况下是必要的还是安全的做法?
  • 如果没有其他阶段性更改,继续提交。
【解决方案5】:

这是一种“取消跟踪”任何文件的方法,否则这些文件会在当前的排除模式集下被忽略:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

这会将文件保留在您的工作目录中,但会将它们从索引中删除。

这里使用的技巧是向 git ls-files 提供一个不存在的索引文件,以便它认为没有跟踪的文件。上面的 shell 代码询问如果索引为空则将被忽略的所有文件,然后使用 git rm 从实际索引中删除它们。

在“未跟踪”文件后,使用 git status 验证是否删除了任何重要的内容(如果是,请调整您的排除模式并使用 git reset --path 来恢复已删除的索引条目)。然后进行一个新的提交,去掉“crud”。

“crud”仍然存在于任何旧的提交中。如果你真的需要一个干净的历史记录,你可以使用 git filter-branch 生成旧提交的干净版本(nb 使用 git filter-branch 将“重写历史记录”,所以如果你有任何合作者已经拉在首次引入“crud”之后的任何历史提交)。

【讨论】:

  • 听起来像是一个可靠的解决方案 :) 我想这是针对 Linux shell 的吧?不幸的是,我是 Win7 用户。有什么办法可以在 Windows 中做到这一点?
【解决方案6】:

使用git clean
获取有关此运行的帮助

git clean -h

如果您想先看看会发生什么,请确保通过 -n 开关进行试运行:

git clean -xn

要清除 gitingnored 垃圾

git clean -xdf

小心:您可能会忽略本地配置文件,例如 database.yml,这些文件也会被删除。使用风险自负。

然后

git add .
git commit -m ".gitignore is now working"
git push

【讨论】:

    【解决方案7】:

    我认为这是将 .gitignore 文件添加到现有存储库的简单方法。

    先决条件

    您需要一个浏览器才能访问您的 github 帐户。

    步骤

    1. 在您所需的(现有)项目中创建一个新文件并将其命名为 .gitignore。将文件命名为 .gitignore 后,您将获得 .gitignore 模板的提示性提示。使用这些模板或使用gitignore.io 来生成您的 gitignore 文件的内容。
    2. 提交更改。
    3. 现在克隆此存储库。

    玩得开心!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-29
      • 2015-05-24
      • 2019-07-01
      • 2021-02-24
      • 2020-05-10
      • 1970-01-01
      • 2018-09-28
      • 2023-03-09
      相关资源
      最近更新 更多