【问题标题】:Applying .gitignore to committed files将 .gitignore 应用于提交的文件
【发布时间】:2011-11-23 14:05:16
【问题描述】:

我已经提交了大量现在想忽略的文件。我如何告诉 git 现在从未来的提交中忽略这些文件?

编辑:我也想从存储库中删除它们。它们是在构建后创建的文件或用于用户特定工具支持的文件。

【问题讨论】:

标签: git


【解决方案1】:

编辑.gitignore 以匹配被忽略的文件后,您可以执行git ls-files -ci --exclude-standard 以查看包含在排除列表中的文件;然后你可以做

  • Linux/MacOS:git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
  • Windows (PowerShell):git ls-files -ci --exclude-standard | % { git rm --cached "$_" }
  • Windows (cmd.exe):for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"

从存储库中删除它们(不从磁盘中删除它们)。

编辑:您也可以在 .gitconfig 文件中将其添加为别名,以便您可以随时运行它。只需在 [alias] 部分下添加以下行(根据 Windows 或 Mac 的需要进行修改):

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

(xargs 中的 -r 标志可防止 git rm 在空结果上运行并打印出其使用消息,但可能仅受 GNU findutils 支持。xargs 的其他版本可能有也可能没有类似的选项。)

现在您只需在您的存储库中输入git apply-gitignore,它就会为您完成这项工作!

【讨论】:

  • 我认为 Mac 的 xargs 没有 -r... 或者我的错误/旧,我不知道... 为什么在 git 之前使用 !?好吧...我的一个是alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"。 tks!
  • 在 Windows for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
  • 工作完美。非常感谢!
  • 谢谢!这很棒。
  • 对于 mac 用户,-r 是默认值,BSD 版本不接受。所以删除-r
【解决方案2】:

【讨论】:

  • 有很多文件。我不想对每个人都这样做
  • 文件是否在任何公共目录中?如果不是,问题就归结为 shell 使用问题,而不是 git 问题。
  • 确实需要一个'我忘记添加我的 .gitignore 直到我的初始提交'模式。
  • 答案在这个下面。
  • 它要求我添加标志 -r 才能这样做。
【解决方案3】:

将文件保留在 repo 中,但忽略将来对其进行的更改:

git update-index --assume-unchanged <file>

并撤消此操作:

git update-index --no-assume-unchanged <file>

找出以这种方式设置的文件:

git ls-files -v|grep '^h'

感谢原始答案 http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/

【讨论】:

  • Chronial 有一个很好的答案,可以递归地为目录执行此操作:stackoverflow.com/a/16346756/1101076
  • 我想提交一个 IDE 配置,但不想跟踪不必要的更改。这行得通,但我不确定它是否适用于查看存储库的其他人。如果有帮助,它可以与git ls-files -ci --exclude-standard -z | xargs -0 git update-index --assume-unchanged 结合使用。
  • 这是唯一的答案,它完全符合标题问题的要求。完美的!大多数其他答案都不必要地弄乱了文件。
  • 这是该问题的完全正确答案。使用git rm --cached 之类的命令将删除存储库中的文件,这不符合测验者的需要。谢谢你。对此,我真的非常感激。你的回答对我帮助很大。
  • 最后一个命令,在 Windows 上,将 grep 替换为 findstr 以获得相同的结果。 git ls-files -v|findstr '^h'
【解决方案4】:

确保您的实际存储库是最新版本并且没有持续更改

  1. 根据需要编辑.gitignore
  2. git rm -r --cached .(删除所有文件)
  3. git add .(根据gitignore重新添加所有文件)

然后像往常一样提交

【讨论】:

  • 这应该是公认的答案,因为问题特别指出有很多文件要删除。
  • 请注意,如果您的存储库很大,第 2 步可能需要一段时间。
  • 这只是导致从索引中删除所有文件! This救了我:git reset HEAD(记得隐藏任何更改)
  • 第 2 步删除了所有内容,是的,但第 3 步应该全部读取,除了那些因 .gitignore 而失败的内容。
  • 这在类似情况下帮助了我,谢谢!修复了删除我不小心添加到 Python 存储库中的大量文件
【解决方案5】:

老问题,但我们中的一些人在git-posh (powershell)。这是解决方案:

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }

【讨论】:

    【解决方案6】:
    1. 将您的文件名/文件路径添加到 .gitignore 文件中。
    2. 现在在 git bash git rm --cached file/path/from/root/folder 中运行命令
    3. 现在使用git commit 提交您的代码。

    现在文件不应在git status 命令中被跟踪。

    【讨论】:

      【解决方案7】:

      我倾向于忘记/我懒得阅读这些 git 命令的作用。所以我这样做:

      • 我将所有我想忽略的文件暂时移到了存储库之外
      • 我在我的 git GUI 中提交了这些“已删除文件”(它们现在未被跟踪)
      • 我更新了 .gitignore 文件
      • 我将文件移回存储库(或删除它们,如果这是我的意图)

      【讨论】:

        【解决方案8】:

        İ如果你已经提交,你可以使用这个:

        1. 将文件夹路径添加到 .gitignore 文件。
        2. 运行此命令以删除 exe(对于其他文件扩展名,只需写入“*extension”)文件。 git rm --cached *exe
        3. 提交更改。

        您应该为每个要删除的扩展程序执行此操作。

        【讨论】:

          【解决方案9】:

          按照以下步骤操作:

          1. 添加gitignore文件的路径

          2. 运行这个命令

            git rm -r --cached foldername
            
          3. 像往常一样提交更改。

          【讨论】:

            猜你喜欢
            • 2015-04-17
            • 2020-01-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-25
            • 1970-01-01
            • 2021-04-14
            相关资源
            最近更新 更多