如何使Git“忘记”已跟踪但现在位于.gitignore中的文件?


5388

跟踪了一个文件git,但现在该文件在.gitignore列表中。

但是,该文件在git status编辑后一直显示在。您如何强迫git自己完全忘记它?


16
git clean -X听起来很相似,但不适用于这种情况(当Git仍在跟踪文件时)。我正在为寻求解决方案而不遵循错误路线的任何人写这篇文章。
imz –伊万·扎哈拉里舍夫(Ivan Zakharyaschev)

35
唯一的真正答案是在下面,请参见git update-index --assume-unchanged。该解决方案1)将文件保留在服务器上(索引),2)让您在本地自由修改文件。
Qwerty

8
您需要使用--skip-worktree,请参阅:stackoverflow.com/questions/13630849/…–
Doppelganger

77
一个重要的问题是:文件是否应该保留在存储库中?例如,如果有人新克隆了仓库,他们是否应该得到文件?如果是,git update-index --assume-unchanged <file>正确,文件将保留在存储库中,并且不会使用添加更改git add。如果为(例如,它是某些缓存文件,生成的文件等),则将git rm --cached <file>从存储库中将其删除。
马丁

9
@Martin @Qwerty每个人都应该停止告知--assume-unchanged哪个性能是为了防止git检查大的跟踪文件的状态,而是更喜欢--skip-worktree哪个是用户不想再提交的修改后的跟踪文件。参见stackoverflow.com/questions/13630849/…–
Philippe

Answers:


5688

.gitignore将阻止将未跟踪的文件添加add -f到git跟踪的文件集中(不带),但是git将继续跟踪已被跟踪的所有文件。

要停止跟踪文件,您需要将其从索引中删除。此命令可以实现。

git rm --cached <file>

如果要删除整个文件夹,则需要递归删除其中的所有文件。

git rm -r --cached <folder>

从主修订版中删除文件将在下一次提交时发生。

警告:虽然这不会从本地删除物理文件,但会在next上从其他开发人员计算机删除文件git pull


55
对我有用的过程是1.首先提交未决的更改2. git rm --cached <file>并再次提交3.将文件添加到.gitignore,检查git status并再次提交
mataal

117
非常重要的补充。如果忽略的文件将被修改(尽管如此,则不应该提交),在修改和执行之后git add .,它将被添加到索引中。下一次提交会将其提交到存储库。为避免执行此命令,在所有这些mataal说了又一条命令之后:git update-index --assume-unchanged <path&filename>
Dao

32
@AkiraYamamoto的方法对我也很好。就我而言,由于我的存储库中有成千上万个文件,所以我抑制了输出:git rm -r -q --cached .
Aaron Blenkush 2013年

85
但这会删除文件git pull
Petr Peller 2014年

22
git rm --cached <file>只是从存储库中删除文件,git update-index --assume-unchanged <file>在未暂存的更改中未显示文件,并且不会进行新更改。但是我想让GIT仅了解文件内容的内容
Igor Semin

2608

下面的一系列命令将从Git索引中删除所有项(而不是从工作目录或本地存储库中删除),然后更新Git索引,同时注意git忽略。PS。索引=缓存

第一:

git rm -r --cached . 
git add .

然后:

git commit -am "Remove ignored files"

或单线:

git rm -r --cached . && git add . && git commit -am "Remove ignored files"

197
要突出此答案与接受的答案之间的区别:使用此命令,您实际上不需要知道受影响的文件。(想象一个临时目录,其中包含许多应从索引中清除的随机文件)。
路德维希2014年

53
与接受的答案相同。文件将在上删除git pull
彼得·佩勒

73
将此作为标准git命令会很好。有点像git rmignored
Berik 2014年

12
@gudthing -r表示“递归”
马克·

14
这样,您可能最终会添加当前不在中的其他无用文件.gitignore。如果根据git status此命令后的噪声程度,可能很难找出哪个。仅删除新忽略的文件的命令会更好。这就是为什么我更喜欢thSoft的答案
KurzedMetal

1122

git update-index为我完成了这项工作:

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

注意:该解决方案实际上是独立于.gitignoregitignore的,仅适用于未跟踪的文件。

编辑:自从发布此答案以来,已经创建了一个新选项,应该优先使用。您应该--skip-worktree对用户不想再提交的修改过的跟踪文件使用哪个,并保持--assume-unchanged性能以防止git检查大跟踪文件的状态。有关更多详细信息,请参见https://stackoverflow.com/a/13631525/717372 ...

git update-index --skip-worktree <file>

173
真正的答案。真棒,非常简单,不会污染,git status而且非常直观。谢谢。
Pablo Olmos de Aguilera C.

4
我寻求足够好的rm [...] .解决方案,因为至少我可以理解它是如何工作的。我发现没有什么很好的文档update-index--assume-unchanged做。任何人都可以添加此文件与其他文件的比较,因为我想删除所有被忽略的文件?(或指向清晰说明的链接?)
布雷迪·培训师

25
git update-index --assume-unchanged <path> …不论导致,都会导致git忽略指定路径中的更改.gitignore。如果您从远程拉出,并且该远程对此路径进行了更改,则git会因合并失败而失败,因此您需要手动进行合并。 git rm --cached <path> …将导致git停止跟踪该路径。如果您不添加.gitignore路径,则将来会看到该路径git status。第一个选项在git提交历史记录中具有较少的干扰,并且允许将来对“忽略”文件的更改进行分发。
ManicDee 2014年

26
对于这不是公认的答案,我感到很困惑。此处接受的答案显然不是在回答实际的问题。此答案将忽略对存储库中文件的更改,而不是将其从存储库中删除。
Dave Cooper

11
如果准确地解释了给定命令的功能(例如,它与其他建议的解决方案有何不同),则此答案将大为有用。
LarsH

283
git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

这将获取被忽略文件的列表,并将其从索引中删除,然后提交更改。


7
如果您也需要从工作目录中删除它们,则只需运行git ls-files --ignored --exclude-standard | xargs git rm 。我相信这个答案是最好的!因为它非常清晰,所以采用Unix方式,并且可以直接完成所需的操作,而无需考虑其他更复杂命令的副作用。
imz-伊万·扎哈拉里舍夫(Ivan Zakharyaschev),2015年

6
好答案;但是,如果中间有空格,则该命令将失败,例如:“ My dir / my_ignored_file.txt”
David Hernandez

8
git ls-files --ignored --exclude-standard | sed's /.*/"&"/'| xargs git rm --cached
David Hernandez

3
git rm如果ls-files没有匹配项,将会抱怨。使用xargs -r git rm ...要告诉xargs不运行git rm,如果没有文件匹配。
沃尔夫冈

10
最好使用\ 0作为分隔符:git ls-files --ignored --exclude-standard -z|xargs -0 git rm --cached
Nils-o-mat

83

我总是使用此命令删除那些未跟踪的文件。单行,Unix风格的干净输出:

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

它列出了所有被忽略的文件,将每个输出行替换为带引号的行,以处理内部带有空格的路径,并将所有内容传递git rm -r --cached给索引中的路径/文件/目录。


3
很好的解决方案!完美工作和感觉更正确的,删除所有文件,然后将其添加回。
乔恩·卡特莫尔

5
我也发现这个“最干净”。可能很明显,但是仅运行第一部分,git ls-files --ignored --exclude-standard就可以让您首先了解/验证新文件.gitignore将要排除/删除的文件,然后再执行最终文件git rm
JonBrave 2015年

请注意,文件名中包含某些“讨厌”字符的文件将失败\n。我已经发布了解决方案来满足此要求。
JonBrave 2015年

3
另一个警告:拉时,这将导致文件在其他人的工作目录中删除,对吗?
LarsH '16

尝试过,但对我不起作用:sed: 1: "s/.*/": unterminated substitute in regular expression在带空格的存储库上执行filter-branch命令。(不过似乎在过滤器分支之外工作)。我用git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached@ JonBrave的 答案吧。
goofology

70

将其移出,提交,然后再移回。这在过去对我有用。可能有一种“ gittier”方式来完成此任务。


2
如果您要忽略一堆以前未忽略的文件,则此方法非常有用。尽管就像您说的那样,可能有一种更好的方法。
奥斯卡·珀森

这正是我所做的。只需将文件移动到git之外的文件夹中,然后执行“ git add。”,“ git commit”。(这删除了文件),然后添加gitignore,引用文件/文件夹,再次提交以将gitignore文件添加到git,然后复制/移回文件夹,应将其忽略。注意:似乎文件已从GIT中删除,因此可能会将它们从其他检出/拉出中删除,如上述解决方案中所述,但是由于您最初是在复制它们,因此IMHO并不是一个大问题。只是让团队的其他成员知道...
德尔

这是摆脱错误提交的文件夹的最简单方法。
Martlark

1
我看到的似乎是唯一的方法。这是git中的一个巨大错误(不是“功能”),一旦您将文件/文件夹添加到.gitignore,它就不会永远忽略该文件(永远如此)。
JosephK

在我添加了它们之后,然后在事实将它们添加到.gitignore之后,此方法起作用了
hanzolo

66

如果您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魔术为您应用和删除更改,例如,将配置文件作为替代分支的签出进行涂抹,并清洁配置文件作为HEAD的签出。这是棘手的东西,我不建议新手使用。
  • 将配置文件保留在专用于它的部署分支上,该分支永远不会合并到master。当您要部署/编译/测试时,您可以合并到该分支并获取该文件。除了使用人工合并策略和Extra-git模块外,这实质上是污迹/清除方法。
  • 反建议:不要使用假设不变的方法,它只会以眼泪结束(因为git自欺欺人会导致不好的事情发生,例如您的更改永远丢失)。

7
如果删除时文件很脏,git不会删除它。而且,如果文件不脏,则检索该文件就像git checkout <oldref> -- <filename>- 一样容易,但是它将被检出并被忽略。
amenthes 2014年

关于您的最后一个注释(关于--assume-unchanged):或者这是对货物的狂热,应该予以驳回,或者您可以解释为什么(我相信),并且它变得有用。
RomainValeri

57

在以下情况下使用此:

1.您要取消跟踪许多文件,或者

2.您更新了gitignore文件

来源连结: http : //www.codeblocq.com/2016/01/Untrack-files-already-add-to-git-repository-based-on-gitignore/

假设您已经将一些文件添加/提交到git存储库,然后将它们添加到.gitignore;中。这些文件仍将存在于您的存储库索引中。本文我们将看到如何摆脱它们。

步骤1:提交所有更改

在继续之前,请确保所有更改都已提交,包括.gitignore文件。

步骤2:从存储库中删除所有内容

要清除您的仓库,请使用:

git rm -r --cached .
  • rm是删除命令
  • -r将允许递归删除
  • –cached仅从索引中删除文件。您的文件仍然在那里。

rm命令可能无法原谅。如果您想事先尝试一下它的功能,请添加-n--dry-run标志以进行测试。

步骤3:重新添加所有内容

git add .

步骤4:提交

git commit -m ".gitignore fix"

您的存储库是干净的:)

将更改推送到您的遥控器,以查看更改是否也在那里生效。


1
它不会从远程存储库中删除文件吗?如果我想同时在本地存储库和远程存储库中保留文件,但让git“忘记”它们怎么办?
Avishay28年

AFAIK不会从历史记录中删除文件,因为我们没有使用任何历史记录更改命令(如果我错了,请纠正我)。这只会通过从git中删除gitignore中忽略的文件来添加新的提交。历史承诺
Dheeraj Bhaskar

49

我通过使用git filter-branch实现了这一点。我使用的确切命令来自手册页:

警告:这将从您的整个历史记录中删除该文件

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

该命令将重新创建整个提交历史记录,git rm并在每次提交之前执行,因此将删除指定的文件。不要忘了运行该命令,因为它之前对其进行备份丢失。


9
这将更改所有提交ID,从而破坏存储库副本外部分支的合并。
bdonlan

19
警告:这将从您的整个历史记录中删除该文件。这是我一直在寻找的内容,用于删除版本历史中很久以前提交的完全不必要且过大的文件(输出永远不应该提交的输出)。
zebediah49

48

什么对我不起作用

(在Linux下),我想使用此处的建议ls-files --ignored --exclude-standard | xargs git rm -r --cached方法。但是,(某些)要删除的文件\n的名称中带有嵌入式换行符/ LF / 。两种解决方案都没有:

git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

应付这种情况(获取有关找不到文件的错误)。

所以我提供

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached
git commit -am "Remove ignored files"

它使用-z参数LS-文件-0参数xargs的,以满足安全/正确的“讨厌的”文件名中的字符。

在手册页git-ls-files(1)中,它指出:

不使用-z选项时,路径名中的TAB,LF和反斜杠字符分别表示为\ t,\ n和\\。

所以我认为如果文件名中包含任何这些字符,则需要我的解决方案。


1
对我来说,这是最好的解决方案。它的性能优于git add .。它还包含上述一些评论中的最佳改进。
Nils-o-mat

git commit -am "Remove ignored files"可以在答案中加上thSoft的事吗?您的答案
加深

我不明白的目的git commit -a。对我来说,它git rm --cached影响索引的精确度,因此在...之后无需
Jean Paul

23
  1. 更新.gitignore文件-例如,添加您不想跟踪的文件夹.gitignore

  2. git rm -r --cached .–删除所有跟踪的文件,包括有用和不需要的文件。只要您保存在本地,您的代码就将是安全的。

  3. git add .–除中的文件外,所有文件都将重新添加.gitignore


给@AkiraYamamoto的帽子提示,以指向正确的方向。


1
怎么样降低票数,因为它实际上无法正常工作,因为无论如何您都需要-r来递归运行rm :)(有人未正确复制)
Aran Mulholland

1
警告:此技术实际上并不会导致git忽略文件,而是会导致git删除文件。这意味着,如果您使用此解决方案,则任何其他人只要执行git pull,文件就会被删除。因此,它实际上并没有被忽略。请参阅建议使用git update-index --assume-unchanged的解决方案,以获取原始问题的解决方案。
orrd

16

我认为,也许git不能完全忽略文件,因为它的概念(“快照,无差异”部分)。

例如,在使用CVS时,不会出现此问题。CVS将信息存储为基于文件的更改的列表。CVS的信息是一组文件,并且每个文件随时间所做的更改。

但是,每次您提交或保存项目状态时,在Git中,它基本上都会拍下当时所有文件的样子,并存储对该快照的引用。因此,如果添加一次文件,该文件将始终存在于该快照中。

这2篇文章对我有帮助:

git假定未更改vs skip-worktree 以及如何使用Git忽略跟踪文件中的更改

基于此,如果已经跟踪文件,则执行以下操作:

git update-index --skip-worktree <file>

从这一刻起,此文件中的所有本地更改将被忽略,并且不会转到远程。如果在远程上更改了文件,则发生冲突git pull。藏匿将无法正常工作。要解决此问题,请将文件内容复制到安全的地方,然后执行以下步骤:

git update-index --no-skip-worktree <file>
git stash
git pull 

文件内容将被远程内容替换。将您所做的更改从安全位置粘贴到文件中,然后再次执行:

git update-index --skip-worktree <file>

如果每个与项目一起工作的人都可以执行git update-index --skip-worktree <file>,那么问题pull就不存在了。每个开发人员都有自己的项目配置时,此解决方案适用于配置文件。

每次在远程上更改文件后,每次执行此操作都不太方便,但是可以防止远程内容覆盖它。


16

依次执行以下步骤,就可以了。

1. 从目录/存储中删除错误添加的文件。您可以使用“ rm -r”(对于linux)命令或通过浏览目录将其删除。或将它们移动到PC上的其他位置。[如果正在运行以进行移动/移动,则可能需要关闭IDE ]

2. gitignore现在将文件/目录添加到文件并保存。

3.现在通过使用以下命令它们从git cache中删除(如果目录不止一个,则通过重复发出此命令将它们一个一个地删除)

git rm -r --cached path-to-those-files

4.now 一个提交并推送,使用这些命令。这将从git remote删除这些文件,并使git 停止跟踪那些文件。

git add .
git commit -m "removed unnecessary files from git"
git push origin

13

复制/粘贴答案是 git rm --cached -r .; git add .; git status

该命令将忽略已经提交到Git存储库的文件,但是现在我们将它们添加到了.gitignore


9

Matt Fear的回答是最有效的恕我直言。以下仅是PowerShell脚本,适用于Windows中的脚本,仅用于从与其排除列表匹配的git存储库中删除文件。

# 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 .

在什么情况下,此文件列表不等于递归--cached?
John Zabroski 2014年

8

将文件移动或复制到安全位置,以免丢失。然后git rm文件并提交。如果恢复到较早的提交之一或尚未删除该文件的另一个分支,该文件仍将显示。但是,在以后的所有提交中,您将不再看到该文件。如果该文件在git中忽略,则可以将其移回该文件夹,而git将看不到它。


34
git rm --cached将从索引中删除文件而不将其从磁盘中删除,因此无需移动/复制文件
bdonlan

7

使用该git rm --cached命令不能回答原始问题:

您如何强迫git完全忘记[文件]?

实际上,此解决方案将导致在执行!时在存储库的所有其他实例中删除文件git pull

正确的方法,以力混帐忘掉一个文件被GitHub的记录在这里

我建议阅读文档,但是基本上:

git fetch --all
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch full/path/to/file' --prune-empty --tag-name-filter cat -- --all
git push origin --force --all
git push origin --force --tags
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

只需替换full/path/to/file为文件的完整路径即可。确保已将文件添加到.gitignore

您还需要(临时)允许非快进推送到存储库,因为您正在更改git历史记录。


5

BFG是专为去除像混帐回购大文件或密码不需要的数据而设计的,所以它有一个简单的标志,将消除任何大型历史(未在你的当前提交)文件:“--strip-blobs-大于

$ java -jar bfg.jar --strip-blobs-bigger-than 100M

如果您想按名称指定文件,也可以这样做:

$ java -jar bfg.jar --delete-files *.mp4

BFG比git filter-branch快10-1000倍,并且通常更容易使用-请查看完整的使用说明示例以获取更多详细信息。

资料来源:https : //confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html


5

如果您不想使用CLI并在Windows上运行,则非常简单的解决方案是使用TortoiseGit,它在菜单中具有“删除(保持本地)”操作,效果很好。


5

我喜欢JonBrave的答案,但是我的工作目录杂乱无章,可以提交-吓到我了,所以这是我做的事情:

git config --global alias.exclude-ignored'!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“新建gitignore并从索引中删除忽略的文件”'

分解:

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"
  • 从索引中删除忽略的文件
  • .gitignore和您刚刚删除的文件
  • 承诺

4

在最新的git(撰写本文时为v2.17.1)中,这不再是问题

.gitignore最后忽略跟踪,但删除的文件。您可以通过运行以下脚本自行测试。最后的git status声明应报告“无可奉告”。

# 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现在做到了。但是,OP询问是否不跟踪.gitignore中存在的文件中的修改,而不是仍显示状态的已删除文件。
mrturtle

2

如果已经提交DS_Store

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

通过以下方式忽略它们:

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

最后,提交!


2

特别是对于基于IDE的文件,我使用以下命令:

例如slnx.sqlite,我完全摆脱了它,如下所示:

git rm {PATH_OF_THE_FILE}/slnx.sqlite -f
git commit -m "remove slnx.sqlite"

请记住,其中一些文件存储了项目的某些本地用户设置和首选项(例如您打开的文件)。因此,每次您在IDE中导航或进行某些更改时,该文件都会更改,因此它会将其检出并显示为未提交的更改。


2

接受的答案不会“使Git 忘记文件...”(历史上)。它只会使git 忽略当前/将来的文件。

这种方法使git 完全忘记了被忽略的文件(过去 /现在/将来),但是没有从工作目录(远程即使再拉)删除任何东西。

这种方法需要的使用/.git/info/exclude(首选)一个预先存在 .gitignore所有有文件提交到可以忽略/忘记。1个

所有强制执行git的方法都会事后忽略行为,从而有效地重写了历史记录,因此对在此过程之后可能被拉出的任何公共/共享/协作存储库都有明显的影响2

一般建议:从干净的仓库开始 -提交的所有东西,在工作目录或索引中没有待处理的东西,然后进行备份

此外,评论/ 修订历史这个答案和修订历史这个问题)可能是有用/启发。

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch

git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch

git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#Commit to prevent working directory data loss!
#this commit will be automatically deleted by the --prune-empty flag in the following command
#this command must be run on each branch

git commit -m "ignored index"

#Apply standard git ignore behavior RETROACTIVELY to all commits from all branches (--all)
#This step WILL delete ignored files from working directory UNLESS they have been dereferenced from the index by the commit above
#This step will also delete any "empty" commits.  If deliberate "empty" commits should be kept, remove --prune-empty and instead run git reset HEAD^ immediately after this command

git filter-branch --tree-filter 'git ls-files -z --ignored --exclude-standard | xargs -0 git rm -f --ignore-unmatch' --prune-empty --tag-name-filter cat -- --all

#List all still-existing files that are now ignored properly
#if this command returns nothing, it's time to restore from backup and start over
#this command must be run on each branch

git ls-files --other --ignored --exclude-standard

最后,遵循本GitHub指南的其余部分(从第6步开始),其中包括有关以下命令的重要警告/信息

git push origin --force --all
git push origin --force --tags
git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

从现在修改的远程仓库中提取的其他开发人员应进行备份,然后:

#fetch modified remote

git fetch --all

#"Pull" changes WITHOUT deleting newly-ignored files from working directory
#This will overwrite local tracked files with remote - ensure any local modifications are backed-up/stashed

git reset FETCH_HEAD

脚注

1因为/.git/info/exclude可以使用上面的说明将其应用于所有历史提交,所以有关将.gitignore文件放入需要历史提交的文件的详细信息可能超出了此答案的范围。我希望一个适当的.gitignore人参与root提交,好像这是我做的第一件事。其他人可能不在乎,因为/.git/info/exclude无论.gitignore提交历史记录中存在什么内容,它们都可以完成相同的事情,并且即使在意识到后果的情况下,显然重写历史记录也是非常敏感的主题。

FWIW,潜在方法可能包括git rebasegit filter-branch外部 复制.gitignore到每个提交中,例如该问题的答案

2通过提交独立git rm --cached命令的结果来强制执行git事后忽略行为,这可能会导致在将来从强制推送的远程操作中删除新忽略的文件。--prune-empty以下git filter-branch命令中的标志通过自动删除以前的“删除所有忽略的文件”仅索引提交来避免此问题。重写git历史记录也会更改提交哈希,这将对公共/共享/协作存储库中的将来撤回造成严重破坏。在执行此回购之前,请充分了解其后果该GitHub指南指定了以下内容:

告诉你的合作者底垫中合并,他们创造了旧的(污点)仓库的历史掉任何分支机构。一次合并提交可能会重新引入您刚刚遇到清除麻烦的部分或全部历史记录。

影响远程回购的替代解决方案是git update-index --assume-unchanged </path/file>git update-index --skip-worktree <file>,可以在此处找到其示例。


0

如果有人在Windows上遇到麻烦,而您想忽略整个文件夹,请单击“ cd”以获取“文件夹”,然后执行“ Git Bash Here”。

git ls-files -z | xargs -0 git update-index --assume-unchanged

0

在这里,我需要删除多个目录中的几个.lock文件。我运行了以下程序,它无需进入每个目录即可将其删除而起作用:

git rm -r --cached **/*.lock

这样做会进入我所在位置“根”下的每个文件夹,并排除所有与模式匹配的文件。

希望这对别人有帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.