有一个文件正在被跟踪 git ,但现在该文件位于 .gitignore 列表但是,该文件一直显示在中 git status 编辑之后。你是怎么强迫的 git 完全忘记它?
git
.gitignore
git status
zaqlnxep1#
我通过使用git过滤器分支来实现这一点。我使用的确切命令取自手册页:警告:这将从您的整个历史记录中删除该文件
git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD
此命令将重新创建整个提交历史记录,执行 git rm 在每次提交之前,都会删除指定的文件。在运行命令之前不要忘记备份它,因为它将丢失。
git rm
daupos2t2#
使用 git rm --cached
git rm --cached
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 .
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
ocebsuys5#
复制/粘贴答案为 git rm --cached -r .; git add .; git status 此命令将忽略已提交到git存储库的文件,但现在我们已将它们添加到 .gitignore .
git rm --cached -r .; git add .; git status
inkz8wg96#
我认为,也许git不能完全忘记文件,因为它的概念(部分“快照,而不是差异”)。例如,在使用cvs时,不存在此问题。cvs将信息存储为基于文件的更改列表。cvs的信息是一组文件以及随时间对每个文件所做的更改。但在git中,每次提交或保存项目状态时,它基本上都会拍摄到此时所有文件的样子,并存储对该快照的引用。所以,如果只添加一次文件,它将始终出现在该快照中。这两篇文章对我很有帮助:git假设不变vs跳过工作树以及如何使用git忽略跟踪文件中的更改基于此,如果文件已被跟踪,我将执行以下操作:
git update-index --skip-worktree <file>
从现在起,此文件中的所有本地更改都将被忽略,并且不会转到远程。如果在远程上更改了文件,则在 git pull . 藏起来不行。要解决此问题,请将文件内容复制到安全位置,然后执行以下步骤:
git pull
git update-index --no-skip-worktree <file> git stash git pull
文件内容将被远程内容替换。将更改从安全位置粘贴到文件,然后再次执行:
如果与项目一起工作的每个人都将执行 git update-index --skip-worktree <file> ,与 pull 他应该缺席。当每个开发人员都有自己的项目配置时,此解决方案适用于配置文件。每次在远程上更改文件时,这样做不是很方便,但可以保护它不被远程内容覆盖。
pull
gopyfrb37#
按顺序执行以下步骤,你会没事的。1.从目录/存储器中删除错误添加的文件。您可以使用“rm-r”(对于linux)命令,也可以通过浏览目录来删除它们。或者将它们移动到pc上的另一个位置。[如果要移动/删除,可能需要关闭ide]2.将文件/目录添加到 gitignore 现在归档并保存它。3.现在使用这些命令从git缓存中删除它们(如果有多个目录,则通过重复发出此命令逐个删除)
gitignore
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
r55awzrz8#
更新您的 .gitignore 文件–例如,添加一个不想跟踪的文件夹 .gitignore . git rm -r --cached . –删除所有跟踪的文件,包括需要的和不需要的文件。只要您在本地保存,您的代码将是安全的。 git add . –将重新添加所有文件,但中的文件除外 .gitignore .感谢@akirayamamoto为我们指明了正确的方向。
git rm -r --cached .
git add .
7hiiyaii9#
(在linux下),我想使用这里的帖子 ls-files --ignored --exclude-standard | xargs git rm -r --cached 方法但是,要删除的文件中有一个内嵌的换行符/lf/ \n 以他们的名义。这两种解决方案都不是:
ls-files --ignored --exclude-standard | xargs git rm -r --cached
\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和\。因此,我认为如果文件名中有任何这些字符,就需要我的解决方案。
-z
-0
cbwuti4410#
.gitignore 将阻止添加未跟踪的文件(无 add -f )但git将继续跟踪任何已经被跟踪的文件。要停止跟踪文件,需要将其从索引中删除。这可以通过此命令实现。
add -f
git rm --cached <file>
如果要删除整个文件夹,则需要递归删除其中的所有文件。
git rm -r --cached <folder>
将在下次提交时从头部修订中删除该文件。警告:虽然这不会从本地删除物理文件,但它会从下一台计算机上的其他开发人员计算机上删除这些文件 git pull .
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撒谎会导致糟糕的事情发生,比如你的改变永远丢失)。
1cklez4t12#
源链接:http://www.codeblocq.com/2016/01/untrack-files-already-added-to-git-repository-based-on-gitignore/假设您已经将一些文件添加/提交到git存储库,然后将它们添加到.gitignore;这些文件仍将存在于您的存储库索引中。在本文中,我们将看到如何摆脱它们。
继续之前,请确保已提交所有更改,包括.gitignore文件。
要清算回购,请使用:
rm是remove命令-r将允许递归删除–缓存将仅从索引中删除文件。你的文件仍将在那里。这个 rm 命令可以是无情的。如果您希望尝试它之前所做的,请添加 -n 或 --dry-run 用旗子测试东西。
rm
-n
--dry-run
git commit -m ".gitignore fix"
您的存储库是干净的:)将更改推送到您的遥控器上,以查看更改在遥控器上的效果。
yxyvkwin13#
将其移出,提交,然后再移入。这在过去对我很有效。可能有一种“gittier”方法可以实现这一点。
jjjwad0x14#
我总是使用此命令删除那些未跟踪的文件。单行、unix样式、干净输出:
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached
它列出所有被忽略的文件,用带引号的行替换每个输出行,以处理包含空格的路径,并将所有内容传递给 git rm -r --cached 从索引中删除路径/文件/目录。
git rm -r --cached
l2osamch15#
git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached git commit -am "Remove ignored files"
这将获取被忽略文件的列表,并将其从索引中删除,然后提交更改。
17条答案
按热度按时间zaqlnxep1#
我通过使用git过滤器分支来实现这一点。我使用的确切命令取自手册页:
警告:这将从您的整个历史记录中删除该文件
此命令将重新创建整个提交历史记录,执行
git rm
在每次提交之前,都会删除指定的文件。在运行命令之前不要忘记备份它,因为它将丢失。daupos2t2#
使用
git rm --cached
tez616oj3#
matt fear的回答是最有效的imho。下面是一个powershell脚本,用于windows中的用户仅从其git repo中删除与其排除列表匹配的文件。
2wnc66cl4#
对文件/文件夹执行以下步骤:
删除文件:
需要将该文件添加到.gitignore。
需要使用命令(git rm--cached file name)删除该文件。
需要运行(git add.)。
需要(提交-m)“文件已删除”。
最后,(git推)。
例如:
我想删除test.txt文件。我无意中推到github想要删除的命令如下:
首先在.gitignore中添加test.txt
删除文件夹:
需要将该文件夹添加到.gitignore。
需要使用命令(git rm-r--cached folder name)删除该文件夹。
需要运行(git add.)。
需要(提交-m)“文件夹已删除”。
最后,(git推)。
例如:
我想删除.idea文件夹/dir。我无意中推到github想要删除的命令如下:
第一个添加。gitignore中的想法
ocebsuys5#
复制/粘贴答案为
git rm --cached -r .; git add .; git status
此命令将忽略已提交到git存储库的文件,但现在我们已将它们添加到.gitignore
.inkz8wg96#
我认为,也许git不能完全忘记文件,因为它的概念(部分“快照,而不是差异”)。
例如,在使用cvs时,不存在此问题。cvs将信息存储为基于文件的更改列表。cvs的信息是一组文件以及随时间对每个文件所做的更改。
但在git中,每次提交或保存项目状态时,它基本上都会拍摄到此时所有文件的样子,并存储对该快照的引用。所以,如果只添加一次文件,它将始终出现在该快照中。
这两篇文章对我很有帮助:
git假设不变vs跳过工作树以及如何使用git忽略跟踪文件中的更改
基于此,如果文件已被跟踪,我将执行以下操作:
从现在起,此文件中的所有本地更改都将被忽略,并且不会转到远程。如果在远程上更改了文件,则在
git pull
. 藏起来不行。要解决此问题,请将文件内容复制到安全位置,然后执行以下步骤:文件内容将被远程内容替换。将更改从安全位置粘贴到文件,然后再次执行:
如果与项目一起工作的每个人都将执行
git update-index --skip-worktree <file>
,与pull
他应该缺席。当每个开发人员都有自己的项目配置时,此解决方案适用于配置文件。每次在远程上更改文件时,这样做不是很方便,但可以保护它不被远程内容覆盖。
gopyfrb37#
按顺序执行以下步骤,你会没事的。
1.从目录/存储器中删除错误添加的文件。您可以使用“rm-r”(对于linux)命令,也可以通过浏览目录来删除它们。或者将它们移动到pc上的另一个位置。[如果要移动/删除,可能需要关闭ide]
2.将文件/目录添加到
gitignore
现在归档并保存它。3.现在使用这些命令从git缓存中删除它们(如果有多个目录,则通过重复发出此命令逐个删除)
4.现在执行提交和推送,使用以下命令。这将从git remote中删除这些文件,并使git停止跟踪这些文件。
r55awzrz8#
更新您的
.gitignore
文件–例如,添加一个不想跟踪的文件夹.gitignore
.git rm -r --cached .
–删除所有跟踪的文件,包括需要的和不需要的文件。只要您在本地保存,您的代码将是安全的。git add .
–将重新添加所有文件,但中的文件除外.gitignore
.感谢@akirayamamoto为我们指明了正确的方向。
7hiiyaii9#
什么对我不起作用
(在linux下),我想使用这里的帖子
ls-files --ignored --exclude-standard | xargs git rm -r --cached
方法但是,要删除的文件中有一个内嵌的换行符/lf/\n
以他们的名义。这两种解决方案都不是:应对这种情况(获取有关未找到文件的错误)。
所以我提议
这使用
-z
ls文件的参数,以及-0
参数,以安全/正确地处理文件名中的“讨厌”字符。在手册页面git ls文件(1)中,它指出:
未使用-z选项时,路径名中的制表符、lf和反斜杠字符分别表示为\t、\n和\。
因此,我认为如果文件名中有任何这些字符,就需要我的解决方案。
cbwuti4410#
.gitignore
将阻止添加未跟踪的文件(无add -f
)但git将继续跟踪任何已经被跟踪的文件。要停止跟踪文件,需要将其从索引中删除。这可以通过此命令实现。
如果要删除整个文件夹,则需要递归删除其中的所有文件。
将在下次提交时从头部修订中删除该文件。
警告:虽然这不会从本地删除物理文件,但它会从下一台计算机上的其他开发人员计算机上删除这些文件
git pull
.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撒谎会导致糟糕的事情发生,比如你的改变永远丢失)。
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:从存储库中删除所有内容
要清算回购,请使用:
rm是remove命令
-r将允许递归删除
–缓存将仅从索引中删除文件。你的文件仍将在那里。
这个
rm
命令可以是无情的。如果您希望尝试它之前所做的,请添加-n
或--dry-run
用旗子测试东西。步骤3:重新添加所有内容
步骤4:提交
您的存储库是干净的:)
将更改推送到您的遥控器上,以查看更改在遥控器上的效果。
yxyvkwin13#
将其移出,提交,然后再移入。这在过去对我很有效。可能有一种“gittier”方法可以实现这一点。
jjjwad0x14#
我总是使用此命令删除那些未跟踪的文件。单行、unix样式、干净输出:
它列出所有被忽略的文件,用带引号的行替换每个输出行,以处理包含空格的路径,并将所有内容传递给
git rm -r --cached
从索引中删除路径/文件/目录。l2osamch15#
这将获取被忽略文件的列表,并将其从索引中删除,然后提交更改。