我把以前由 Git 跟踪的文件放在.gitignore 列表中. 但是,文件在编辑后仍然显示在 git 状态。


当前回答

在我的情况下,我需要在.gitignore 文件中插入 ".envrc" 。

然后我用了:

git update-index --skip-worktree .envrc
git rm --cached .envrc

文件已被删除。

然后我再次承诺,说文件已被删除。

但当我使用 git log -p 命令时,文件的内容(这是 Amazon S3 的秘密认证)显示已删除的内容,我不想在 Git 存储库的历史上显示此内容。

然后我用了这个命令:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch .envrc' HEAD

我再也不会看到内容了。

其他回答

把它移动出来,承诺,然后把它移动回来。

这对我来说在过去已经工作了,但可能有更“迷人的”方式来实现这一点。

此方法需要使用 /.git/info/exclude 文件(偏好)或预先存在的.gitignore 在所有有文件要被忽视/忘记的任务中。

执行Git的所有方法都忽略了后事实行为,有效地重写历史,从而对任何公共/共享/合作的存储库产生了显著的分裂,这些存储库可能在这个过程之后被撤回。

#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

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

脚印

告诉你的合作伙伴放弃,不要合并,他们创建的任何分支从你的旧(封闭)存储库历史。 一个合并承诺可以重新引入一些或所有的封闭的历史,你刚刚走到清理问题。

我总是使用这个命令去删除那些未追踪的文件. 单线,Unix风格,清洁输出:

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

它列出所有被忽略的文件,取代每个输出线与引用的线,而不是处理路径的空间,并将一切转移到 git rm -r -cached 以从指数中删除路径 / 文件 / 指南。

BFG 专门用于从 Git 存储库中删除不需要的数据,如大文件或密码,因此它有一个简单的旗帜,将删除任何大历史文件(不属于您的当前文件):‘--strip-blobs-bigger-than’

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

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

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

BFG 比 git 过滤器行业快 10 至 1000 倍,通常更容易使用 - 查看完整使用指示和示例,以获取更多详细信息。

来源:库存大小减少

为文件 / 文件夹执行下列步骤:

删除文件:

需要添加该文件到.gitignore. 需要删除该文件使用命令(git rm --cached 文件名)。 需要运行(git add.). 需要(commit -m)“文件删除”。 最后,(git push)。

例如:

我想删除 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 文件夹名称)。 需要运行(git add.). 需要(commit -m)“文件夹删除”。 最后,(git push)。

例如:

我想删除.idea 文件夹/目录. 我偶然推到 GitHub 并想删除它。

首先,在.gitignore 文件中添加.idea

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