Iva*_*van 4888 git gitignore git-rm
有一个文件被跟踪git
,但现在该文件在.gitignore
列表中.
但是,该文件在git status
编辑后会一直显示.你怎么强迫git
完全忘掉它?
CB *_*ley 5151
.gitignore
将阻止未跟踪文件被添加(没有add -f
)到git跟踪的文件集,但是git将继续跟踪已经被跟踪的任何文件.
要停止跟踪文件,您需要将其从索引中删除.这可以通过此命令实现.
git rm --cached <file>
Run Code Online (Sandbox Code Playgroud)
从头修订中删除文件将在下次提交时发生.
警告:虽然这不会从本地删除物理文件,但它将在下次从其他开发人员计算机中删除文件git pull
.
Mat*_*ear 2476
下面的一系列命令将从Git索引中删除所有项目(而不是从工作目录或本地存储库中删除),然后更新Git索引,同时遵守git忽略.PS.Index =缓存
第一:
git rm -r --cached .
git add .
Run Code Online (Sandbox Code Playgroud)
然后:
git commit -am "Remove ignored files"
Run Code Online (Sandbox Code Playgroud)
Kon*_*tin 1015
git update-index为我做的工作:
git update-index --assume-unchanged <file>
Run Code Online (Sandbox Code Playgroud)
注意:此解决方案实际上是独立的,.gitignore
因为gitignore仅适用于未跟踪的文件.
编辑:由于此答案已过帐,因此创建了一个新选项,应该首选.您应该使用--skip-worktree
哪个用于用户不想再提交的已修改跟踪文件,并保持--assume-unchanged
性能以防止git检查大跟踪文件的状态.有关详细信息,请参阅/sf/answers/954206781/
git update-index --skip-worktree <file>
Run Code Online (Sandbox Code Playgroud)
thS*_*oft 265
git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"
Run Code Online (Sandbox Code Playgroud)
这将获取被忽略文件的列表并将其从索引中删除,然后提交更改.
Dav*_*dez 76
我总是使用此命令删除那些未跟踪的文件.单行,Unix风格,干净的输出:
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached
Run Code Online (Sandbox Code Playgroud)
它列出了所有被忽略的文件,用引用的行替换每个输出行,而不是处理内部有空格的路径,并将所有内容传递git rm -r --cached
给索引中的路径/文件/目录.
Joe*_*oks 61
将它移出,提交,然后将其移回.这在过去对我有用.实现这一目标可能有一种"轻微"的方式.
Set*_*son 61
如果您不能git rm
跟踪文件,因为其他人可能需要它(警告,即使您 git rm --cached
,当其他人获得此更改时,他们的文件也将在其文件系统中删除).这些通常是由配置文件覆盖,身份验证凭据等完成的.请查看https://gist.github.com/1423106,了解人们解决此问题的方法.
总结一下:
Dhe*_*kar 55
来源链接: http ://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/
假设您已经将一些文件添加/提交到您的git存储库,然后将它们添加到您的.gitignore; 这些文件仍将存在于您的存储库索引中.本文我们将看到如何摆脱它们.
在继续之前,请确保已提交所有更改,包括.gitignore文件.
要清除您的仓库,请使用:
git rm -r --cached .
Run Code Online (Sandbox Code Playgroud)
该rm
命令可能是无情的.如果您希望事先尝试它的功能,请添加-n
或--dry-run
标记以测试.
git add .
Run Code Online (Sandbox Code Playgroud)
git commit -m ".gitignore fix"
Run Code Online (Sandbox Code Playgroud)
你的存储库很干净:)
将更改推送到遥控器以查看更改在那里有效.
drr*_*lvn 47
我通过使用git filter-branch完成了这个.我使用的确切命令来自手册页:
警告:这将从您的整个历史记录中删除该文件
git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD
Run Code Online (Sandbox Code Playgroud)
此命令将重新创建整个提交历史记录,git rm
在每次提交之前执行,因此将删除指定的文件.不要忘了运行该命令,因为它之前对其进行备份会丢失.
Jon*_*ave 46
(在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
Run Code Online (Sandbox Code Playgroud)
应对这种情况(获取有关未找到文件的错误).
git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached
Run Code Online (Sandbox Code Playgroud)
它使用-z
参数LS-文件和-0
参数xargs的安全迎合/正确的文件名中的"肮脏"的字符.
在手册页git-ls-files(1)中,它指出:
如果未使用-z选项,则路径名中的TAB,LF和反斜杠字符分别表示为\ t,\n和\\.
所以如果文件名中包含任何这些字符,我认为我的解决方案是必需的.
编辑:我被要求添加 - 就像任何git rm
命令 - 这必须后面提交,以使删除永久,例如git commit -am "Remove ignored files"
.
小智 22
更新.gitignore
文件 - 例如,添加您不想跟踪的文件夹.gitignore
.
git rm -r --cached .
- 删除所有跟踪的文件,包括想要和不需要的文件.只要您在本地保存,您的代码就是安全的.
git add .
- 除了那些文件外,所有文件都将被重新添加.gitignore
.
帽子提示@AkiraYamamoto指出我们正确的方向.
Boo*_*ype 16
我想,也许git不能完全忘记文件,因为它的概念("快照,不是差异"部分).
例如,在使用CVS时,不存在此问题.CVS将信息存储为基于文件的更改列表.CVS的信息是一组文件以及随着时间的推移对每个文件所做的更改.
但是在Git每次提交或保存项目状态时,它基本上都会描绘当时所有文件的外观,并存储对该快照的引用.因此,如果您添加了一次文件,它将始终存在于该快照中.
这两篇文章对我有帮助:
git假设 - 未更改vs skip-worktree 以及如何使用Git忽略跟踪文件中的更改
基于它我会执行以下操作,如果已经跟踪了文件:
git update-index --skip-worktree <file>
Run Code Online (Sandbox Code Playgroud)
从此刻起,此文件中的所有本地更改都将被忽略,并且不会转到远程.如果远程更改了文件,则会发生冲突git pull
.藏匿不起作用.要解决此问题,请将文件内容复制到安全位置并按照以下步骤操作:
git update-index --no-skip-worktree <file>
git stash
git pull
Run Code Online (Sandbox Code Playgroud)
文件内容将被远程内容替换.将更改从安全位置粘贴到文件并再次执行:
git update-index --skip-worktree <file>
Run Code Online (Sandbox Code Playgroud)
如果每个与项目合作的人都会表现出来git update-index --skip-worktree <file>
,那么问题pull
应该是缺席的.当每个开发人员都有自己的项目配置时,此解决方案适用于配置文件.
在远程更改文件时,每次执行此操作都不是很方便,但可以保护它不被远程内容覆盖.
Ars*_*mad 15
对文件/文件夹执行以下步骤:
删除文件:
例如:
我想删除test.txt文件。我不小心推送到 GitHub 并想删除它。命令如下:
首先,在文件.gitignore 中添加“test.txt”
git rm --cached test.txt
git add .
git commit -m "test.txt removed"
git push
Run Code Online (Sandbox Code Playgroud)
删除文件夹:
例如:
我想删除.idea文件夹/目录。我不小心推送到 GitHub 并想删除它。命令如下:
首先,在文件.gitignore 中添加.idea
git rm -r --cached .idea
git add .
git commit -m ".idea removed"
git push
Run Code Online (Sandbox Code Playgroud)
Sha*_*jib 14
按顺序执行以下步骤,你会没事的.
1. 从目录/存储中删除错误添加的文件.您可以使用"rm -r"(用于linux)命令或通过浏览目录删除它们.或者将它们移动到PC上的其他位置.[如果运行移动/移除,您可能需要关闭IDE ]
2.立即将文件/目录添加到gitignore
文件中并保存.
3.现在使用这些命令将它们从git缓存中删除(如果有多个目录,请通过重复发出此命令逐个删除它们)
git rm -r --cached path-to-those-files
Run Code Online (Sandbox Code Playgroud)
4. 现在进行提交和推送,使用这些命令.这将从git remote中删除这些文件并使git 停止跟踪这些文件.
git add .
git commit -m "removed unnecessary files from git"
git push origin
Run Code Online (Sandbox Code Playgroud)
you*_*ans 13
复制/粘贴答案是 git rm --cached -r .; git add .; git status
此命令将忽略已提交到Git存储库的文件,但现在我们已将其添加到.gitignore
.
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 .
Run Code Online (Sandbox Code Playgroud)
接受的答案不会“让 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 the current index, not the 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
Run Code Online (Sandbox Code Playgroud)
最后,请遵循本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
Run Code Online (Sandbox Code Playgroud)
从现在修改的远程存储库中提取的其他开发人员应该进行备份,然后:
#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
Run Code Online (Sandbox Code Playgroud)
1因为/.git/info/exclude
可以使用上面的说明应用于所有历史提交,所以也许有关将.gitignore
文件放入需要它的历史提交的详细信息超出了本答案的范围。我希望.gitignore
根提交中有一个正确的文件,就好像这是我做的第一件事一样。其他人可能不在乎,因为无论文件存在于提交历史记录中/.git/info/exclude
的何处,都可以完成相同的事情,并且显然重写历史记录是非常困难的.gitignore
敏感的主题,即使意识到后果也是如此。
FWIW,潜在的方法可能包括git rebase
或git filter-branch
复制外部 .gitignore
到每个提交中,就像这个问题的答案一样。
2通过提交独立git rm --cached
命令的结果强制 Git 事后忽略行为可能会导致在将来从强制推送的远程拉取时删除新忽略的文件。--prune-empty
以下命令中的标志通过git filter-branch
自动删除先前的“删除所有忽略的文件”仅索引提交来避免此问题。重写 Git 历史记录还会更改提交哈希,这将对未来从公共/共享/协作存储库中提取数据造成严重破坏。在对此类存储库执行此操作之前,请充分了解其后果。本 GitHub 指南指定了以下内容:
告诉你的合作者rebase,而不是他们从旧的(受污染的)存储库历史记录创建的任何分支进行变基,而一次合并提交可能会重新引入您刚刚费尽心思清除的部分或全部受污染的历史记录。
不影响远程存储库的替代解决方案是git update-index --assume-unchanged </path/file>
或,可以在此处git update-index --skip-worktree <file>
找到其示例。
就我而言,我需要将“ .envrc
”放入.gitignore文件中。
然后我用了:
git update-index --skip-worktree .envrc
git rm --cached .envrc
Run Code Online (Sandbox Code Playgroud)
并且该文件已被删除。
然后我再次提交,告诉我该文件已被删除。
但是当我使用该命令时git log -p
,文件的内容(这是Amazon S3的秘密凭证)显示了已删除的内容,并且我不想在 Git 存储库的历史记录中显示此内容。
然后我使用了这个命令:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch .envrc' HEAD
Run Code Online (Sandbox Code Playgroud)
而且我再也看不到内容了。
将文件移动或复制到安全位置,这样您就不会丢失它.然后git rm文件并提交.如果您还原到其中一个早期提交,或者另一个尚未删除的分支,该文件仍将显示.但是,在将来的所有提交中,您都不会再看到该文件.如果文件在git中忽略,那么你可以将它移回文件夹,git将不会看到它.
小智 5
该BFG是专为去除像混帐回购大文件或密码不需要的数据而设计的,所以它有一个简单的标志,将消除任何大型历史(未在你的当前提交)文件:“--strip-blobs-大于
$ java -jar bfg.jar --strip-blobs-bigger-than 100M
Run Code Online (Sandbox Code Playgroud)
如果您想按名称指定文件,也可以这样做:
$ java -jar bfg.jar --delete-files *.mp4
Run Code Online (Sandbox Code Playgroud)
BFG比git filter-branch快10-1000倍,并且通常更容易使用-请查看完整的使用说明和示例以获取更多详细信息。
资料来源:https : //confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html
在最新的 Git (撰写本文时为 v2.17.1)中,这不再是问题。
.gitignore文件最终会忽略已跟踪但已删除的文件。您可以通过运行以下脚本自行测试。最终git status
声明应报告“无需承诺”。
# Create an empty repository
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
Run Code Online (Sandbox Code Playgroud)
我喜欢JonBrave的回答,但是我的工作目录杂乱无章,可以提交-吓到我了,所以这是我做的事情:
git config --global alias.exclude-ignored'!git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached && git ls文件-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"
Run Code Online (Sandbox Code Playgroud)
使用该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
Run Code Online (Sandbox Code Playgroud)
只需替换full/path/to/file
为文件的完整路径即可。确保已将文件添加到.gitignore
。
您还需要(临时)允许非快进推送到存储库,因为您正在更改git历史记录。
归档时间: |
|
查看次数: |
1109960 次 |
最近记录: |