问题中的两个例子实际上都是非常糟糕的例子,可能导致数据丢失!
我的建议:/*
除非有充分的理由,否则请勿追加到.gitignore文件中的目录!
例如,一个很好的理由是Jefromi写道:“如果您随后打算忽略该目录中的某些内容,”。
否则不应该这样做的原因是,附加/*
到目录的方式一方面可以正确地忽略目录的所有内容,但另一方面却具有危险的副作用:
如果在git stash -u
存储库中执行(临时存储跟踪和未跟踪的文件)或git clean -df
(删除未跟踪但保留被忽略的文件),则所有带有附加名被忽略的目录都/*
将被不可逆地删除!
一些背景
我不得不努力学习。我团队中的某人正在追加/*
到.gitignore中的某些目录。随着时间的流逝,某些目录有时会突然消失。应用程序需要具有千兆字节本地数据的目录。没有人能解释,我总是讨厌重新下载所有数据。一段时间后,我意识到可能与之有关git stash
。有一天,我想清理我的本地存储库(同时保留被忽略的文件),我正在使用git clean -df
,然后数据又消失了。这次我受够了并且调查了这个问题。我终于知道原因是附加的/*
。
我认为可以通过directory/*
忽略目录的所有内容而不忽略目录本身的事实来解释它。因此,删除内容时,既不会将其视为跟踪对象,也不会忽略它。即使git status
并git status --ignored
给它一个略有不同的图片。
如何繁殖
这是重现行为的方法。我目前正在使用Git 2.8.4。
将在本地git存储库中创建一个localdata/
其中包含虚拟文件的目录(important.dat
),并将其/localdata/*
放入.gitignore
文件中将忽略其内容。现在执行上述两个git命令之一时,该目录将(意外)丢失。
mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file
如果您在git status --ignored
此处进行操作,则会得到:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
untracked-file
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
localdata/
现在要么做
git stash -u
git stash pop
要么
git clean -df
在这两种情况下,据称忽略的目录localdata
都将消失!
不确定是否可以将其视为错误,但是我想至少它是没人需要的功能。
我将其报告给git开发列表,看看他们对此有何看法。
.gitignore
忽略的文件和目录之间有区别吗?例如,data
vsdata/
表示不同的意思吗?