4

我过去向 git 提交了一些错误的文件。之后我排除并忽略了这些文件:

git rm --cached -r config.php
git reset config.php
echo "config.php" >> .gitignore
git update-index --assume-unchanged config.php

现在 git commit 效果很好。config.php 中的更改未提交。

但是:如果我存储工作目录以切换分支,那么 config.php 将从本地存储库中恢复。

如何在git stash不更改忽略(以及排除索引)文件的情况下使用?

4

2 回答 2

0

编辑后的答案

你做了一个git rm --cached -r config.php,但没有提交那个改变。

Next you did git reset config.php,清除了git rm你之前做的效果。所以你现在回到了你开始的地方。

然后,您添加config.php.gitignore. 这不会有任何影响,因为config.php现在仍在跟踪。

最后,您执行了 a git update-index --assume-unchanged config.php,因此如果您执行git status/ ,则任何更改都不会在本地可见git diff。这些步骤给人一种错觉,当它们没有时,它们工作得很好git rm.gitignore

相反,这样做(-r标志是多余的,这不是目录)

git rm --cached config.php
echo config.php >> .gitignore && git add .gitignore
git commit -m "removing config.php"

原始答案

但是:如果我存储工作目录以切换分支,那么 config.php 将从本地存储库中恢复。

好吧,您刚刚从当前分支中删除了 config.php(让我们调用它master),但另一个分支other仍在跟踪它。所以这就是你看到它的原因。与它无关git stash

您可能应该将分支合并masterother以将提交带入分支other

于 2013-11-14T15:41:23.320 回答
0

我在https://help.github.com/articles/remove-sensitive-data找到了一个解决方案:

git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch config.php' \
--prune-empty --tag-name-filter cat -- --all

可能有reset必要将其从未来的提交中排除:

git reset config.php

从本地分支中删除 config.php 的所有信息后,我强制推送以更新远程 repos:

git push origin master --force

现在,我的存储区工作正常。

于 2013-11-15T09:58:29.847 回答