用新的.gitignore文件重新同步git repo


191

更新gitignore文件后是否可以“刷新” git存储库?

我刚刚在gitignore中添加了更多ignorations(?),并希望删除与新文件匹配的回购中已经存在的东西。



可能是,该解决方案会删除与新gitignore匹配的已提交文件吗?
ChristianWattengård11年

99
+1用于发明“无知”一词。
2011年

3
en.wiktionary.org/wiki/ignoration @AasmundEldhuset,它是官方的
Daniel Springer

1
@ user770:今天我学到了!
Aasmund Eldhuset

Answers:


370

.gitignore文件不忽略 ”中提到的解决方案有点极端,但应该可以:

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

(请确保首先提交您要保留的更改,以免发生以下jball037 注释引起的任何事件。
--cached选项将使您的文件在磁盘上保持不变。)

在博客文章“ 使Git忽略已跟踪的文件 ”中,您还具有其他更细粒度的解决方案:

git rm --cached `git ls-files -i --exclude-standard`

巴西姆在他的编辑中建议:

路径中有空格的文件

如果您收到类似的错误消息fatal: path spec '...' did not match any files,则可能是文件路径中带有空格。

您可以使用option删除所有其他文件--ignore-unmatch

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

但不匹配的文件将保留在您的存储库中,并且必须通过使用双引号将其路径括起来来显式删除它们:

git rm --cached "<path.to.remaining.file>"

我发现git add步骤是不必要的,当我在git rm --cached之后运行git status时,删除的文件已经在暂存区中,您可以继续进行提交。
2015年

3
我只是这样做,丢掉了我所有未提交的更改,几乎宣布我辞职。这个线程上公认的答案挽救了我的生命:stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037 2015年

2
@VonC抱歉,这并不意味着要大声疾呼:)但是,是的,我使用了--cached,当我检查文件时,所有未提交的更改都丢失了。惊慌了片刻,但“ git reset HEAD”恢复了我的文件(但是这次没有我在.gitignore中指定的文件,因此您的解决方案仍然有效!)
jball037 2015年

3
@ jball037很好。我已添加警告并相应地编辑了答案。
VonC

1
如果仅在执行此操作之前我进一步阅读了一行“((请确保首先提交您要保留的更改,以免发生jball037”)#fml
Aiden Strydom

9

我可能会误会,但是您是要删除新忽略的文件还是要忽略对这些文件的新修改?在这种情况下,事情就可以了。

如果要删除先前提交的忽略文件,请使用

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'

这里的单引号是什么?
IgorGanapolsky

这是一个很好的答案
Holene

这是一个非常简单的为什么在我更新.gitignore之后删除文件,但是它需要进行一些小更新:``git rm –cached git ls-files -i –exclude-standard git commit -m'clean up”
Aaron

1

我知道这是一个老问题,但是如果文件名包含空格,gracchus的解决方案将无法正常工作。VonC解决方案中带空格的文件名的方法是不使用来--ignore-unmatch删除它们,而是手动删除它们,但是如果存储空间很大,这将无法正常工作。

这是一个利用bash数组捕获所有文件的解决方案。

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

git commit -m 'ignore update'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.