我过去曾向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
?
答案 0 :(得分:0)
已编辑的答案
您执行了git rm --cached -r config.php
,但没有提交更改。
接下来你做了git reset config.php
,这清除了你以前做过git rm
的效果。所以你现在回到你开始的地方。
然后,您将config.php
添加到.gitignore
。这不会有任何影响,因为现在仍然会跟踪config.php
。
最后,您执行了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
无关。
您可能应该将分支master
合并到other
以将提交带入分支other
。
答案 1 :(得分: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的所有信息之后,我强行推送更新远程回购:
git push origin master --force
现在,我的藏匿区工作正常。