【问题标题】:Apply git .gitignore rules to an existing repository [duplicate]将 git .gitignore 规则应用于现有存储库 [重复]
【发布时间】:2010-07-15 18:24:18
【问题描述】:

我开始在一个 xcode 项目中使用 git,最近发现我可以使用 .gitignore 和 .gitattributes 文件来忽略来自编译器和系统的噪音。 现在我已经有了 .gitignore 和 .gitattributes 文件,我该如何“应用”新的忽略规则并摆脱版本控制中的垃圾?

我的 .gitignore 文件是:

# xcode noise
*.modelv3
*.pbxuser
*.perspective
*.perspectivev3
*.pyc
*~.nib/
build/*

# Textmate - if you build your xcode projects with it
*.tm_build_errors

# old skool
.svn

# osx noise
.DS_Store
profile

我的 .gitattributes 文件是:

*.pbxproj -crlf -diff -merge

谢谢!

【问题讨论】:

  • +1 Chris 评论中的链接对我来说比此页面上的任何内容都更有效。
  • 不,不, this is the right way。大多数建议的答案重新提交所有文件。

标签: git


【解决方案1】:

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

(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 生成旧提交的干净版本(注意,使用 git filter-branch 将“重写历史记录”,因此如果您不应该轻易采取在引入“crud”第一次之后,有任何协作者拉取了您的任何历史提交)。

【讨论】:

  • 这个解决方案对我来说更有意义:stackoverflow.com/questions/1139762/gitignore-file-not-ignoring
  • 这个命令是如何执行的?将其粘贴到终端会出现错误-bash: git: command not found,但我可以在该目录中执行 git 命令。
  • @Answerbot:type git 说什么?听起来它是一个别名(或 shell 函数?)。 git 对您来说不仅是一个普通的外部命令,这一事实会导致 shell 在与临时环境变量分配结合使用时失败(例如,FOO=bar git … 不会扩展您的 git 别名,并且您的 PATH 没有 @ 987654330@)。任何一个都会因 xargs 而失败,因为 xargs 正在执行您的命令本身,而不是使用 shell 来执行它。你要么需要“扩展”你的 git 使用来匹配你的别名/函数,要么使用捆绑相同效果的外部包装脚本。
  • 感谢@ChrisJohnsen 的详细回复。 type git 返回git is hashed (/usr/local/bin/git)。关于扩展 git 以匹配或使用外部包装器的任何好的参考?
  • @Answerbot:因为你的git 似乎是一个外部命令,所以我的猜测是错误的;扩展或包装不适用,因为您的 git 不是别名或 shell 函数。我编写了要粘贴到(与 Bourne 兼容的)shell 中的命令,它在 kshbashzsh 中对我有用。现在,我对你的外壳为什么会产生这些症状没有其他猜测。
【解决方案2】:

对文件使用git rm --cached,对build/ 目录使用git rm -r --cached

【讨论】:

  • 虽然这准确,但我从 Google 来到这里,发现一个无用的答案,因为这是一次一个文件的方法。像 Chris Johnsen 这样的答案会更有帮助和效率,它告诉您如何一步完成所有应该被忽略的文件。
  • 这是一个更好的答案:stackoverflow.com/a/1139797/743957
  • 这不一定是一个文件。运行git rm -r --cached * 清除所有内容。
【解决方案3】:

如果您已经在跟踪要忽略的文件,则必须使用删除它们

git rm --cached <file>

Git 不会忽略已跟踪的文件(即您使用 git add 添加它们)。

【讨论】:

  • 这个命令总是为我设置文件为已删除......
  • @MladenDanic 没关系,git 说它将文件视为已删除。由于“--cached”运算符,该文件实际上不会被删除,但 git 现在有效地将其视为已删除。
  • 但是如果我没记错的话它会从远程仓库中删除,对吧?
  • 是的,如果你之后推送。但我认为这正是你想要的。
【解决方案4】:

mv the_file_i_want_to_ignore the_file_i_want_to_ignore.back

git rm the_file_i_want_to_ignore

mv the_file_i_want_to_ignore.back the_file_i_want_to_ignore

git status

git commit -m 'ignore a bunch of stuff i should have ignored before'

这有点像手动工作流程,但我过去就是这样做的。

【讨论】:

  • 你真的很想用git rm --cached
【解决方案5】:

如果你想完全删除文件,那么这里是handy reference from Github

请注意:

  1. 这将改写您的历史记录,因此可能只有在发布您的存储库之前才值得这样做。
  2. 请记住,旧的 shas 仍将保留在对象数据库中,但我链接到的指南也会向您展示如何处理这些内容。

【讨论】:

    【解决方案6】:

    您不必“应用”更改。只需将 .gitignore 文件放在您的主目录(如果您希望它是全局的)或您的项目根目录中(如果您希望它仅对该项目唯一)。

    编辑:我突然想到您可能遇到此问题,因为您已经添加了不想跟踪的文件。以下是 gitignore 手册页对此的说明:

    请注意,所有 gitignore 文件实际上只涉及 git 尚未跟踪的文件;为了忽略已跟踪文件中未提交的更改,请参阅 git update-index --assume-unchanged 文档。

    【讨论】:

    • 不喜欢这个答案的人...请提供反馈,说明您为什么不喜欢它。无缘无故地投反对票是没有帮助的。
    猜你喜欢
    • 2011-08-11
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2012-09-23
    • 2021-02-07
    • 2023-03-03
    相关资源
    最近更新 更多