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

edqdpe6u  于 2021-09-08  发布在  Java
关注(0)|答案(17)|浏览(395)

有一个文件正在被跟踪 git ,但现在该文件位于 .gitignore 列表
但是,该文件一直显示在中 git status 编辑之后。你是怎么强迫的 git 完全忘记它?

zaqlnxep

zaqlnxep1#

我通过使用git过滤器分支来实现这一点。我使用的确切命令取自手册页:
警告:这将从您的整个历史记录中删除该文件

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

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

daupos2t

daupos2t2#

使用 git rm --cached

tez616oj

tez616oj3#

matt fear的回答是最有效的imho。下面是一个powershell脚本,用于windows中的用户仅从其git repo中删除与其排除列表匹配的文件。


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

2wnc66cl4#

对文件/文件夹执行以下步骤:
删除文件:
需要将该文件添加到.gitignore。
需要使用命令(git rm--cached file name)删除该文件。
需要运行(git add.)。
需要(提交-m)“文件已删除”。
最后,(git推)。
例如:
我想删除test.txt文件。我无意中推到github想要删除的命令如下:
首先在.gitignore中添加test.txt

git rm --cached test.txt
git add .
git commit -m "test.txt removed"
git push

删除文件夹:
需要将该文件夹添加到.gitignore。
需要使用命令(git rm-r--cached folder name)删除该文件夹。
需要运行(git add.)。
需要(提交-m)“文件夹已删除”。
最后,(git推)。
例如:
我想删除.idea文件夹/dir。我无意中推到github想要删除的命令如下:
第一个添加。gitignore中的想法

git rm -r --cached .idea
git add .
git commit -m ".idea removed"
git push
ocebsuys

ocebsuys5#

复制/粘贴答案为 git rm --cached -r .; git add .; git status 此命令将忽略已提交到git存储库的文件,但现在我们已将它们添加到 .gitignore .

inkz8wg9

inkz8wg96#

我认为,也许git不能完全忘记文件,因为它的概念(部分“快照,而不是差异”)。
例如,在使用cvs时,不存在此问题。cvs将信息存储为基于文件的更改列表。cvs的信息是一组文件以及随时间对每个文件所做的更改。
但在git中,每次提交或保存项目状态时,它基本上都会拍摄到此时所有文件的样子,并存储对该快照的引用。所以,如果只添加一次文件,它将始终出现在该快照中。
这两篇文章对我很有帮助:
git假设不变vs跳过工作树以及如何使用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 他应该缺席。当每个开发人员都有自己的项目配置时,此解决方案适用于配置文件。
每次在远程上更改文件时,这样做不是很方便,但可以保护它不被远程内容覆盖。

gopyfrb3

gopyfrb37#

按顺序执行以下步骤,你会没事的。
1.从目录/存储器中删除错误添加的文件。您可以使用“rm-r”(对于linux)命令,也可以通过浏览目录来删除它们。或者将它们移动到pc上的另一个位置。[如果要移动/删除,可能需要关闭ide]
2.将文件/目录添加到 gitignore 现在归档并保存它。
3.现在使用这些命令从git缓存中删除它们(如果有多个目录,则通过重复发出此命令逐个删除)

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

4.现在执行提交和推送,使用以下命令。这将从git remote中删除这些文件,并使git停止跟踪这些文件。

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

r55awzrz8#

更新您的 .gitignore 文件–例如,添加一个不想跟踪的文件夹 .gitignore . git rm -r --cached . –删除所有跟踪的文件,包括需要的和不需要的文件。只要您在本地保存,您的代码将是安全的。 git add . –将重新添加所有文件,但中的文件除外 .gitignore .
感谢@akirayamamoto为我们指明了正确的方向。

7hiiyaii

7hiiyaii9#

什么对我不起作用

(在linux下),我想使用这里的帖子 ls-files --ignored --exclude-standard | xargs git rm -r --cached 方法但是,要删除的文件中有一个内嵌的换行符/lf/ \n 以他们的名义。这两种解决方案都不是:

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 参数,以安全/正确地处理文件名中的“讨厌”字符。
在手册页面git ls文件(1)中,它指出:
未使用-z选项时,路径名中的制表符、lf和反斜杠字符分别表示为\t、\n和\。
因此,我认为如果文件名中有任何这些字符,就需要我的解决方案。

cbwuti44

cbwuti4410#

.gitignore 将阻止添加未跟踪的文件(无 add -f )但git将继续跟踪任何已经被跟踪的文件。
要停止跟踪文件,需要将其从索引中删除。这可以通过此命令实现。

git rm --cached <file>

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

git rm -r --cached <folder>

将在下次提交时从头部修订中删除该文件。
警告:虽然这不会从本地删除物理文件,但它会从下一台计算机上的其他开发人员计算机上删除这些文件 git pull .

w1e3prcc

w1e3prcc11#

如果你不能 git rm 跟踪文件,因为其他人可能需要它(警告,即使您 git rm --cached ,当其他人得到此更改时,他们的文件将在文件系统中被删除)。由于配置文件覆盖、身份验证凭据等原因,通常会执行这些操作。请查看https://gist.github.com/1423106 人们解决这个问题的方法。
总结如下:
让应用程序查找被忽略的文件config-overide.ini,并在提交的文件config.ini上使用该文件(或者,查找~/.config/myapp.ini或$myconfig文件)
提交文件config-sample.ini并忽略文件config.ini,必要时使用脚本或类似文件复制该文件。
尝试使用gittributes clean/smudge magic为您应用和删除更改,例如,将配置文件涂抹为备用分支的 checkout ,并将配置文件清理为head的 checkout 。这是个棘手的问题,我不推荐新手使用。
将配置文件保留在一个专用于它的部署分支上,该分支永远不会合并到master。当您想要部署/编译/测试时,可以合并到该分支并获取该文件。除了使用人工合并策略和额外的git模块外,这基本上是污点/清除方法。
反建议:不要使用“假定不变”,它只会以眼泪结束(因为git撒谎会导致糟糕的事情发生,比如你的改变永远丢失)。

1cklez4t

1cklez4t12#

在以下情况下使用此选项:

1.要取消跟踪大量文件,或

2.您更新了gitignore文件

源链接:http://www.codeblocq.com/2016/01/untrack-files-already-added-to-git-repository-based-on-gitignore/
假设您已经将一些文件添加/提交到git存储库,然后将它们添加到.gitignore;这些文件仍将存在于您的存储库索引中。在本文中,我们将看到如何摆脱它们。

步骤1:提交所有更改

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

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

要清算回购,请使用:

git rm -r --cached .

rm是remove命令
-r将允许递归删除
–缓存将仅从索引中删除文件。你的文件仍将在那里。
这个 rm 命令可以是无情的。如果您希望尝试它之前所做的,请添加 -n--dry-run 用旗子测试东西。

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

git add .

步骤4:提交

git commit -m ".gitignore fix"

您的存储库是干净的:)
将更改推送到您的遥控器上,以查看更改在遥控器上的效果。

yxyvkwin

yxyvkwin13#

将其移出,提交,然后再移入。这在过去对我很有效。可能有一种“gittier”方法可以实现这一点。

jjjwad0x

jjjwad0x14#

我总是使用此命令删除那些未跟踪的文件。单行、unix样式、干净输出:

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

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

l2osamch

l2osamch15#

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

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

相关问题