有一个文件被git跟踪,但现在该文件在.gitignore列表中。
但是,该文件在编辑后仍会显示在git status中。你是如何迫使git完全忘记它的?
- git clean -X听起来很相似,但它不适用于这种情况(当文件仍由git跟踪时)。我写这篇文章是为了让任何人都能找到一个不走错路线的解决方案。
- 唯一真正的答案是下面,见git update-index --assume-unchanged。这个解决方案1)将文件保存在服务器(索引)上,2)允许您在本地自由地修改它。
- 您需要使用--skip-worktree,请参见:stackoverflow.com/questions/13630849/…
- 一个重要的问题是:文件是否应该保留在存储库中?例如,如果有新的克隆repo,他们是否应该得到文件?如果是,那么git update-index --assume-unchanged 是正确的,文件将保留在存储库中,并且更改不会与git add一起添加。如果没有(例如,它是一些缓存文件、生成的文件等),那么git rm --cached 将从存储库中删除它。
- @martin@qwerty everyon应该停止为--assume-unchanged提供建议,这是为了提高性能,防止git检查大跟踪文件的状态,但更喜欢--skip-worktree这是为了修改用户不想再提交的跟踪文件。参见stackoverflow.com/questions/13630849/…
.gitignore将防止未跟踪的文件被添加(没有add -f的文件)到git跟踪的文件集中,但是git将继续跟踪任何已经被跟踪的文件。
要停止跟踪文件,需要将其从索引中删除。这可以通过这个命令来实现。
将在下一次提交时从头部修订中删除文件。
警告:虽然这不会从本地删除物理文件,但会从下一个git pull上的其他开发人员计算机中删除这些文件。
- 对我有效的过程是1。先提交挂起的更改2。git rm——缓存并再次提交3。将文件添加到.gitignore,检查git状态并再次提交
- 非常重要的补充。如果忽略的文件将被修改(但尽管不应提交),在修改和执行git add .之后,它将被添加到索引中。下一次提交将把它提交到存储库。为了避免这种情况的发生,马塔尔又发出了一个命令:git update-index --assume-unchanged 。
- Mataal的评论非常重要。先提交挂起的更改,然后再提交git rm——缓存并再次提交。如果RM是另一个提交的一部分,那么它不会按预期工作。
- 我觉得@akirayamamoto的解决方案更好。
- @Akirayamamoto的方法对我也很有效。在我的例子中,我抑制了输出,因为我的存储库有数千个文件:git rm -r -q --cached .。
- 你应该参考下面赛斯的答案作为这种方法的危险。赛斯提到的确切事情发生在我身上,但由于投票数的增加,我已经按照你的回答做了。
- @马克:没有危险,因为Git只会在签出(合并等)时删除工作树中未更改的文件。在这种情况下,如果开发人员确定他真的想要保留未更改的版本,那么在您删除之前,他可以很容易地从提交中检索到该版本。
- @查尔斯巴利:根据你自己的评论,你已经展示了一种情况,在这种情况下,你可能不想删除文件。仅仅因为你能找回它并不意味着你希望它发生。我用这个方法"停止跟踪"一个文件,当我把它拉到一个QA服务器时,它删除了重要的(但特定于环境的)shell脚本,而不仅仅是不跟踪它。这减慢了部署过程,如果它是一个实时的部署,那么在我检索文件时就会出现停机。我不是说这是错误的方法,我是说你也应该参考赛斯的答案。
- @查尔斯巴利:你当然可以看到塞思的答案有16个加分的原因。可能还有15个人犯了和我一样的错误。
- @马克:你可能不想使用源代码管理工具作为部署策略中的唯一元素,但是如果你这样做了,那么你肯定不会像问问题的人一样,想强迫Git"完全忘记"文件。我在回答中明确地说:"从头部修订中删除文件将在下一次提交时进行。"
- @查尔斯巴利:首先,我们不要小题大做,我没有制定这个部署策略,这是我继承的一个项目。其次,询问者说"文件被编辑后仍会出现在git-st中",所以很明显他们想保留文件,只是不跟踪它,因此为什么有必要发出删除风险的警告。
- 但这将删除EDOCX1上的文件(0)。
- 出于某种原因,我必须在这个解决方案之后立即执行git push。如果我没有,并在文件中进行了更改,它将以git状态弹出。
- git rm--cached只需从存储库中删除文件,git update index--假定未更改的未显示未更改的文件,不进行拉取新更改。但我要Git忽略文件pleeease的内容
- 也可以递归执行:git rm--cached-r lib/data/excel/*
- 如果您对此有问题,请尝试在git repo的根目录中运行它,而不是在子文件夹中运行它。
- @不幸的是,查尔斯巴利在我的情况下不起作用。更改了很多文件。有时我发现问题出在文件结尾(autocrlf),但在禁用它之后,我仍然有4K+文件,它们被认为是更改的,但实际上是相同的。我认为编码有问题,但这只是假设。
- 为了以防万一,您只想删除一些缓存的文件,但却删除了所有这些文件,因为"git rm——cached-r"。您立即对此深表遗憾,这将有助于-"git reset head"。
- 如果你一直得到"致命:路径规范…不匹配任何文件",您可以将它们全部列出为"gitls文件",然后复制和粘贴有问题的文件的路径。
- 我只是对我的Github存储库厌倦了这个答案,但它不起作用。
- @彼得佩勒,没错……那么,正确的解决方案是什么?
- @我在.gitignore中有太多的文件和文件夹。如何在一个步骤中将它们从索引中删除?不像你说的那样,一个接一个地和在一起。
- 这是不对的。使用康斯坦丁下面的答案。
- 对我来说,一个悬而未决的问题是Git应用程序(截至2018年5月)无法正确处理这一问题。即使这些更改是在单个提交中(没有其他更改),使用Git应用程序提交也会导致"提交失败-收到退出代码1"。通过命令行提交和推送最终解决了这个问题。
- 这支持通配符,例如:git rm --cached *.pyc将递归地删除扩展名为.pyc的所有文件。
- 通常用于节点模块:sudo git rm --cached -r ./node_modules/
- 完整答案是git rm --cached -r .; git add .; git status。
- @尤汉斯:完整的答案对我有效。谢谢!
- @尤汉斯:但我似乎必须运行git commit来完成它。
下面的一系列命令将从git索引中删除所有项(不是从工作目录或本地repo中),然后更新git索引,同时忽略git。ps.index=缓存
第一:
1 2
| git rm -r --cached .
git add . |
然后:
1
| git commit -am"Remove ignored files" |
- 它可能需要更多的说明,但是的,这是解决我问题的最佳方法。
- 为了突出这个答案和被接受的答案之间的区别:使用这个命令,您不需要实际了解受影响的文件。(假设有一个临时目录,其中有许多随机文件,应该从索引中清除)。
- 与接受的答案相同。文件将在git pull上删除。
- 我很难找到答案,但是这个解决方案会删除任何文件吗?如果我在我的本地机器上运行这个,将更改推出,然后有人拉,他们会丢失机器上的任何东西吗?
- 最好将它作为标准的git命令。有点像git rmignored。
- 在--cached之前,-r旗的用途是什么?似乎没有它就可以工作
- @gudthing-r代表"递归"
- 此解决方案会导致所有当前文件显示为"新文件"。提交后它们会显示为新文件吗?如何撤消git rm-r。如果你不承诺
- 这样,您最终可能会添加其他不在.gitignore中的无用文件。这可能很难找出是否取决于你的git status在这个命令之后有多大的噪音。只删除新忽略的文件的命令会更好。这就是为什么我更喜欢软的答案
- 这对我有用谢谢
- 但是如果我还不想提交所有的更改呢?
- 谢谢!没有办法浏览所有列出我希望在下一次提交时忽略哪些文件的文件。
- 在使用堆栈溢出上找到的解决方案之前,请先看看。它删除文件!!!!
- 所以,只是为了让你们知道git rm-r-缓存。将从跟踪中删除repo中的每个文件。每个人。不管它是否在gitignore中。我显然是个白痴,真的执行了这个命令,推了lol,我有成千上万的文件。在这个命令之前,我必须打开reflog、git clean-d、check out分支,创建temp分支,设置master跟踪新分支,签出master,并强制push修复它。哎哟。
- 这应该是公认的答案。解决所有问题
- 这是一个危险的命令,因为它还清除了应用于早期文件的-f开关。例如,我们想要显式地保存一个dll文件,那么我们通常要使用-f开关将该文件显式地添加到.git跟踪中。但是,运行git rm -r --cached .命令也将删除以前的强制文件。因此最好使用git rm -r --cached 而不是添加点。
- 不!这弄得一团糟。使用康斯坦丁下面的答案。
- @berik:git clean -X只删除git忽略的文件
- 这对我不起作用。在这些指令之后运行git push,仍然尝试在我的.gitignore中上传文件。
- 有关每个标志对rm的意义的更多详细信息,请参阅本文。
git update index为我做的工作是:
1
| git update-index --assume-unchanged <file> |
注意:这个解决方案实际上独立于.gitignore,因为gitignore只用于未跟踪的文件。
编辑:自发布此答案以来,已创建了一个新选项,应首选该选项。您应该使用--skip-worktree来修改用户不想再提交的跟踪文件,并保持--assume-unchanged的性能,防止git检查大跟踪文件的状态。请参阅https://stackoverflow.com/a/13631525/717372了解更多详细信息…
1
| git update-index --skip-worktree <file> |
- 这才是真正的答案。太棒了,实际上,非常简单,不会污染git status,实际上非常直观。谢谢。
- 我选择了足够好的rm [...] .解决方案,因为至少我可以摸索它是如何工作的。我没有找到关于update-index和--assume-unchanged所做工作的伟大文档。是否有人可以添加此项与另一项的比较结果,因为我希望删除所有将被忽略的文件?(或者链接到清晰的解释?)
- git update-index --assume-unchanged …将导致git忽略指定路径中的更改,而不考虑.gitignore。如果您从一个远程拉,而该远程对该路径有更改,则Git将失败合并并产生冲突,您需要手动合并。git rm --cached …将导致git停止跟踪该路径。如果不将路径添加到.gitignore,您将在将来的git status中看到该路径。第一个选项在git提交历史记录中的噪声更小,并且允许将来分发对"忽略"文件的更改。
- 通过使用:git update index--no来撤消假定未更改
- hg forget多为rm --cached。这个技巧真的很酷(永远忘记)。
- 有关忽略整个目录的信息,请参阅stackoverflow.com/a/12288918/848072。
- 如果已经使用git add添加了文件,请使用git reset 撤消添加,并使用此命令忽略该文件。
- 这应该是带有绿色复选标记的那个。世界上没有正义,该死的:)
- 这是非常有用的(我希望我可以多次投赞成票),但从技术上讲,这不是问题的答案。因为它将独立于.gitignore中的文件,所以我的意思是它不是100%地回答OP问题(尽管它解决了我的问题)。
- 我很困惑为什么这不是公认的答案。这里接受的答案显然不是回答实际问题。此答案忽略对存储库中文件的更改,而不将其从存储库中删除。
- 如果它准确地解释了给定命令的作用,例如,它与其他建议的解决方案有什么不同,那么这个答案将更加有用。
- 例如,如果我使用此选项,从远程获取的其他Repo会知道停止跟踪文件吗?(可能只有当我将文件添加到.gitignore时?)
- 对于子模块中的文件,我们需要执行子模块文件夹中的命令。
- 如果是目录,请确保在目录名的末尾添加一个尾随斜杠。如git update-index --assume-unchanged .history/。
- 这个解决方案正是我想要的。git rm --cached将在拉取时删除已删除的文件(这意味着,您不希望忽略该文件,而是希望删除它)。git rm --cached 和.gitignore是一种误导性的组合。在您的更改之后,不会删除运行git pull的同事的文件的实际解决方案是这个答案。谢谢您!运行git ls-files -v | grep '^[[:lower:]]'以查找以这种方式忽略的文件。
- 这个命令只对你的机器有效,对吗?如果我想停止跟踪所有机器上的文件怎么办?在将来要克隆该代表的计算机上?
- 是的,此命令将只在本地停止跟踪它。要完全停止跟踪文件,只需从存储库中删除if并提交/推送更改。
- 这帮不了我解决,我的案件是文件被转移到远程。所以这个解决方案是临时从我的视图中删除文件,但是如果再次更改了文件,它将返回到我的未分页视图。
- 在eclipse/egit中:右键单击文件>团队>高级>假设不变
- 所以这只能在本地完成,而git rm --cached会在为其他人拉的时候删除它。如果一个人只是想忽略将来对文件的更改,不管是在您的计算机上还是在其他计算机上(已经有了该文件),而不是像在任何计算机上一样自动删除该文件,该怎么办?
1 2
| git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am"Remove ignored files" |
这将获取被忽略文件的列表并将其从索引中删除,然后提交更改。
- 如果您也需要从工作目录中删除它们,那么只需运行git ls-files --ignored --exclude-standard | xargs git rm 。我相信这个答案是最好的!因为它是非常清晰的,unix方式,并且以一种直接的方式完成所需要的事情,而不需要组成其他更复杂命令的副作用。
- 回答很好;但是,如果路径中间有空格,则命令将失败,例如:"my dir/my_ignored_file.txt"
- git ls文件--忽略--排除标准的sed's/*/"&;"/'xargs git rm--缓存
- git ls-files --ignored --exclude-standard | xargs -d"
" git rm --cached
- 请注意,文件名中含有某些"讨厌"字符,如
时会失败。我已经发布了我的解决方案来解决这个问题。
- 如果ls-files不匹配,git rm将投诉。如果没有匹配的文件,用xargs -r git rm ...通知xargs不要运行git rm。
- 最好使用 作为分隔符:git ls-files --ignored --exclude-standard -z|xargs -0 git rm --cached。
- 我的论点列表太长了。我该怎么解开这些被忽略的文件呢??
- 伟大的解决方案。
- @nils-o-mat谢谢,我更新了我的答案。
- 你能解释一下在git commit中增加选项-a的动机吗?对我来说没有必要…
我总是使用这个命令删除那些未跟踪的文件。单行,Unix样式,干净输出:
1
| git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached |
它列出了所有被忽略的文件,用带引号的行替换每个输出行,以处理包含空格的路径,并将所有内容传递给git rm -r --cached,以从索引中删除路径/文件/目录。
- 很好的解决方案!很好地工作,并且感觉更正确,删除所有文件然后再将它们添加回。
- 我也觉得这个"最干净"。这可能很明显,但仅仅运行第一部分,git ls-files --ignored --exclude-standard,就可以让您在继续执行最终的git rm之前,首先了解/验证新.gitignore要排除/删除的文件。
- 请注意,文件名中包含某些"讨厌"字符,如
时会失败。我已经发布了我的解决方案来解决这个问题。
- 另一个警告:在拉取时,这将导致文件在其他人的工作目录中被删除,对吗?
如果由于其他人可能需要跟踪文件而无法执行git rm(警告,即使您执行git rm --cached,当其他人收到此更改时,他们的文件也将在其文件系统中被删除)。这些通常是由于配置文件覆盖、身份验证凭据等原因造成的。请查看https://gist.github.com/1423106了解人们解决问题的方法。
总结:
- 让应用程序查找忽略的文件config-overide.ini,并将其用于提交的文件config.ini(或者,查找~/.config/myapp.ini或$myconfigfile)。
- 提交文件config-sample.ini并忽略文件config.ini,必要时使用脚本或类似的方法复制文件。
- 尝试使用gitattributes clean/smudge magic来应用和删除更改,例如,将配置文件作为签出从备用分支中清除,将配置文件作为签出从头部清除。这是很棘手的事情,我不推荐给新手用户。
- 将配置文件保留在一个专用于它的部署分支上,该分支从未合并到master。当您要部署/编译/测试时,您将合并到该分支并获取该文件。除了使用人工合并策略和额外的Git模块之外,这基本上是一种污点/干净的方法。
- 反建议:不要使用假设不变,它只会以眼泪结束(因为说谎本身会导致坏的事情发生,就像你的改变永远消失一样)。
- 如果文件在删除时变脏了,Git不会删除它。如果文件不是脏的,那么检索该文件就像检索git checkout -- 一样容易,但随后它将被签出并忽略。
- 关于你的最后一封信(关于--assume-unchanged):要么这是货物崇拜,应该解散,要么你可以解释为什么(我相信)它变得有用。
把它搬出去,提交,然后再搬回来。这在过去对我很有效。可能有一种"Gittier"方法来实现这一点。
- 如果你想忽略一堆以前没有被忽略的文件,这个方法非常有效。尽管如你所说,也许还有更好的方法。
- 这正是我所做的。只需将文件移动到Git之外的文件夹,然后执行"Git添加"、"Git提交"。(这删除了文件)然后添加gitignore,引用文件/文件夹,再次提交以将gitignore文件添加到git,然后复制/移回文件夹中,它们应该被忽略。注意:看起来这些文件是从Git中删除的,因此可能会从其他签出/提取中删除它们,如上述解决方案中所述,但是由于您最初是在复制它们,所以这不是一个问题imho。让其他人知道…
- 这是清除错误提交文件夹的最简单方法。
- 似乎是唯一的办法,我能看到。这是一个巨大的缺陷(不是"功能")在Git中,只要你添加一个文件/文件夹到.GitIgnore,它不只是忽略文件从那一点-永远-到处。
当使用:1。你想解开很多文件,或者2。你更新了你的gitignore文件
Source link: http://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/
假设您已经向Git存储库添加/提交了一些文件,然后将它们添加到.GitIgnore;这些文件仍将存在于存储库索引中。这篇文章我们将看到如何摆脱它们。
步骤1:提交所有更改
继续之前,请确保已提交所有更改,包括.gitignore文件。
步骤2:从存储库中删除所有内容
要清除回购,请使用:
- rm是remove命令
- -R将允许递归删除
- –缓存将只从索引中删除文件。您的文件仍将存在。
rm命令可以是不可原谅的。如果你想事先尝试一下它的功能,可以添加-n或--dry-run标志来测试。
第3步:重新添加所有内容
步骤4:提交
1
| git commit -m".gitignore fix" |
您的存储库是干净的:)
将更改推送到遥控器,以查看更改在那里也有效。
- 它不会从远程存储库中删除文件吗?如果我想在本地repo和远程repo中保存这些文件,但是让git"忘记"它们呢?
- afaik这不会从历史中删除文件,因为我们没有使用任何历史更改命令(如果我错了,请纠正我)。这只会通过从git中删除gitignore中忽略的文件来添加新的提交。这些文件将在历史提交中存在
我是通过使用git过滤器分支来实现这一点的。我使用的确切命令来自手册页:
警告:这将从整个历史记录中删除该文件
1
| git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD |
此命令将重新创建整个提交历史记录,在每次提交之前执行git rm,因此将除去指定的文件。不要忘记在运行命令之前备份它,因为它将丢失。
- 这将更改所有提交ID,从而从存储库副本之外的分支中断合并。
- 警告:这将从整个历史记录中删除该文件。不过,这正是我所寻找的,以删除很久以前在版本历史中提交的一个完全不必要和超大的文件(不应该提交的输出)。
什么不适合我
(在Linux下),我想使用这里建议使用ls-files --ignored --exclude-standard | xargs git rm -r --cached方法的文章。但是,(有些)要删除的文件的名称中嵌入了newline/lf/
。两种解决方案都没有:
1 2 3
| git ls-files --ignored --exclude-standard | xargs -d"
" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached |
处理这种情况(获取未找到文件的错误)。
所以我提供
1
| git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached |
这使用了ls文件的-z参数和xargs的-0参数来安全/正确地处理文件名中的"讨厌"字符。
在手册页Git LS文件(1)中,它说明:
When -z option is not used, TAB, LF, and backslash characters in
pathnames are represented as \t,
, and \\, respectively.
因此,如果文件名中包含任何这些字符,我认为需要我的解决方案。
编辑:我被要求添加这一点---就像任何git rm命令---这之后必须有一个承诺,使删除永久化,例如git commit -am"Remove ignored files"。
- 对我来说,这是最好的解决办法。它的性能比git add .好得多。它还包含了来自上面一些评论的最佳改进。
- 很好的解决方案,效果很好
- 正确处理删除了名称中带有空格的文件。
- 你能在回答后加上thsoft的git commit -am"Remove ignored files"吗?你的回答让我通过了一些事情:J
- 我不明白git commit -a的目的。对我来说,git rm --cached正好影响索引,所以不需要在……
更新你的.gitignore文件——例如,添加一个你不想跟踪到.gitignore的文件夹。
git rm -r --cached .–删除所有跟踪文件,包括需要和不需要的文件。只要您在本地保存,您的代码就会是安全的。
git add .–除.gitignore中的文件外,所有文件都将重新添加。
向@akirayamamoto提供帽子提示,说明我们的方向正确。
- 因为实际上它不会工作,因为您需要-r来递归地运行rm,所以拒绝投票怎么样:(有人没有正确地复制)
- 警告:此技术实际上不会导致git忽略该文件,而是实际导致git删除该文件。这意味着,如果使用此解决方案,任何其他人执行git pull时,文件都将被删除。所以它并没有被忽略。请参阅建议Git更新索引的解决方案——假设原始问题的解决方案不变。
我认为,也许Git不能完全忘记文件,因为它的概念(部分"快照,而不是差异")。
例如,当使用cvs时,这个问题是不存在的。cvs将信息存储为基于文件的更改列表。cvs的信息是一组文件以及随时间对每个文件所做的更改。
但在Git中,每次提交或保存项目状态时,它基本上都会拍摄一张当时所有文件的样子,并存储对该快照的引用。因此,如果添加文件一次,它将始终出现在该快照中。
这两篇文章对我很有帮助:
Git假定不变vs跳过工作树以及如何使用git忽略跟踪文件中的更改
基于此,如果文件已被跟踪,我将执行以下操作:
1
| git update-index --skip-worktree <file> |
从现在起,此文件中的所有本地更改都将被忽略,不会转到远程。如果在远程上更改了文件,当git pull时将发生冲突。Stash不起作用。要解决此问题,请将文件内容复制到安全位置,然后执行以下步骤:
1 2 3
| git update-index --no-skip-worktree <file>
git stash
git pull |
文件内容将被远程内容替换。将更改从安全位置粘贴到文件,然后再次执行:
1
| git update-index --skip-worktree <file> |
如果与项目合作的每个人都将执行git update-index --skip-worktree ,那么pull的问题应该不存在。当每个开发人员都有自己的项目配置时,这个解决方案对于配置文件是可以的。
每次在远程上更改文件时都这样做不是很方便,但可以防止被远程内容覆盖。
依次执行以下步骤,你会没事的。
1.从目录/存储中删除错误添加的文件。您可以使用"rm-r"(对于Linux)命令,也可以通过浏览目录来删除它们。或者将它们移动到电脑上的另一个位置。[如果正在运行以进行移动/删除,可能需要关闭IDE]
2.现在将文件/目录添加到gitignore文件并保存。
3.现在使用这些命令从Git缓存中删除它们(如果有多个目录,则通过重复发出此命令逐个删除它们)
1
| git rm -r --cached path-to-those-files |
4.现在执行提交和推送,使用这些命令。这将从git-remote中删除这些文件,并使git停止跟踪这些文件。
1 2 3
| git add .
git commit -m"removed unnecessary files from git"
git push origin |
马特·恐惧的回答是最有效的。以下只是一个PowerShell脚本,用于Windows中的用户仅从其Git报告中删除与其排除列表匹配的文件。
1 2 3 4 5 6 7 8 9 10 11 12
| # Get files matching exclusionsfrom .gitignore
# Excluding comments and empty lines
$ignoreFiles = gc .gitignore | ?{$_ -notmatch "#"} | ?{$_ -match "\S"} | % {
$ignore ="*" + $_ +"*"
(gci -r -i $ignore).FullName
}
$ignoreFiles = $ignoreFiles| ?{$_ -match "\S"}
# Remove each of these file from Git
$ignoreFiles | % { git rm $_}
git add . |
复制/粘贴答案是git rm --cached -r .; git add .; git status。
此命令将忽略已经提交到Git存储库的文件,但现在我们已将它们添加到.gitignore中。
将文件移动或复制到安全位置,这样就不会丢失文件。然后git rm文件并提交。如果您恢复到以前的某个提交,或者恢复到另一个尚未删除的分支,文件仍然会显示出来。但是,在将来的所有提交中,您将不会再看到该文件。如果文件在git-ignore中,那么可以将其移回文件夹中,而git将看不到该文件。
- git rm --cached将从索引中删除文件,而不从磁盘中删除,因此无需移动/复制它。
bfg是专门为从git repos中删除不需要的数据(如大文件或密码)而设计的,因此它有一个简单的标志,可以删除任何大的历史(不在当前提交中)文件:"--strip blobs bigger than"
1
| $ java -jar bfg.jar --strip-blobs-bigger-than 100M |
如果要按名称指定文件,也可以这样做:
1
| $ java -jar bfg.jar --delete-files *.mp4 |
bfg比git filter分支快10-1000倍,而且通常更容易使用-有关更多详细信息,请查看完整的使用说明和示例。
来源:https://confluence.atlassian.com/bitback/reduce-repository-size-321848262.html
如果您不想使用CLI,并且在Windows上工作,一个非常简单的解决方案是使用TortoisGit,它在菜单中有"删除(保留本地)"操作,可以正常工作。
我喜欢琼布雷的回答,但我有足够混乱的工作目录提交-有点让我害怕,所以我做了以下的事情:
git config—全局别名.exclude-ignored'!git ls files-z--忽略--排除标准xargs-0 git rm-r--缓存的&;git ls文件-z--忽略--排除标准xargs-0 git stage&;git stage.gitignore&;git commit-m"new gitignore and remove ignored files from index"'
分解:
1 2 3 4
| git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached
git ls-files -z --ignored --exclude-standard | xargs -0 git stage
git stage .gitignore
git commit -m"new gitignore and remove ignored files from index" |
- 从索引中删除忽略的文件
- stage.gitignore和刚删除的文件
- 犯罪
这在最新的Git中不再是一个问题(在编写时是2.17.1版)。
.gitignore最终忽略跟踪但删除的文件。您可以通过运行下面的脚本自己测试这一点。最终的git status声明应报告"无需承诺"。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| # Create empty repo
mkdir gitignore-test
cd gitignore-test
git init
# Create a file and commit it
echo"hello"> file
git add file
git commit -m initial
# Add the file to gitignore and commit
echo"file"> .gitignore
git add .gitignore
git commit -m gitignore
# Remove the file and commit
git rm file
git commit -m"removed file"
# Reintroduce the file and check status.
# .gitignore is now respected - status reports"nothing to commit".
echo"hello"> file
git status |
- 我很高兴Git现在这么做。但是,操作询问不跟踪.gitignore中存在的文件中的修改,未删除的文件仍显示状态。
尤其是对于基于IDE的文件,我使用以下命令:
例如slnx.sqlite,我只是把它完全删除了,如下所示:
1 2
| git rm {PATH_OF_THE_FILE}/slnx.sqlite -f
git commit -m"remove slnx.sqlite" |
请记住,其中一些文件存储了一些本地用户设置和项目首选项(比如您打开的文件)。因此,每当您在IDE中导航或进行某些更改时,该文件都会被更改,因此它会将其签出并显示为存在未提交的更改。
已承诺的,按本合同第十一条第(三)项规定执行:
1
| find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch |
忽略它们:
1 2 3 4 5
| echo".DS_Store">> ~/.gitignore_global
echo"._.DS_Store">> ~/.gitignore_global
echo"**/.DS_Store">> ~/.gitignore_global
echo"**/._.DS_Store">> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global |
最后,做出承诺!