为什么git clean -xfd有时会删除跟踪的文件?我们该如何解决?

时间:2018-08-29 17:52:12

标签: git

有时,git clean -xfd不仅会删除未跟踪的文件和目录,还会删除已跟踪的文件。清理后,我可以使用git reset --hard head还原那些跟踪的文件。所以我的流程往往是:

git clean -xfd

git status               // check whether git deleted tracked files or not
git reset --hard head    // if git deleted tracked files restore them

我怀疑这种过度的删除行为可能与在先前的提交中重命名文件或目录有关,并且清除然后删除了该重命名的项目。这只是一个猜测。

这是一个已知问题吗?我该如何解决?

2 个答案:

答案 0 :(得分:4)

这里也有同样的问题。简化的存储库结构如下所示:

repository
|
|--dir1
|  |
|  |--junc_dir2
|
|--dir2
|  |
|  |--file
|
|--.gitignore

在回购根目录中,文件夹dir1和dir2以及一个具有以下内容的.gitignore文件

dir1 # ignore dir1

文件夹dir1包含一个到dir2的NTFS连接。文件夹dir2包含一个文件。

文件夹dir1被忽略且未跟踪。跟踪文件夹dir2及其子文件。

您称git clean。它将递归地浏览文件夹dir1的内容并将其删除。这意味着它将通过联结进入dir2,并删除其中的一个(已跟踪)文件。然后出去,它将删除dir2联结和dir1文件夹。您只会留下一个空的dir2文件夹和.gitignore文件。

在一个node.js项目的上下文中发生了我的情况,该项目包含多个在本地交叉引用它们的包(使用npm i ../path/to/package)。参见https://github.com/npm/npm/issues/19091

答案 1 :(得分:1)

在使用目录联结的Windows上可能会发生这种情况。另请参见https://github.com/git-for-windows/git/issues/607

git init
mkdir tracked
echo content >tracked/file
git add tracked
git commit -m initial
cmd //c mklink //j link tracked
git clean -qdfx

最后的git clean将删除tracked/file

Node.js的NPM软件包管理器在安装本地软件包时使用目录连接。具体来说,npm install file:path/to/package将在node_modules/package创建一个目录结。因此,使用Node.js时可能会遇到此问题。

到目前为止,我唯一知道的解决方法是不要在Git工作树中使用联结。