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

问题描述 投票:2回答:2

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

我怀疑这种过度热心的删除可能与在先前的提交中重命名文件或目录有关,而干净然后删除了重命名的项目。这只是猜测。

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

git
2个回答
4
投票

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

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

在repo根目录中,文件夹dir1和dir2以及一个.gitignore文件包含以下内容

dir1 # ignore dir1

文件夹dir1包含到dir2的NTFS结点。文件夹dir2包含一个文件。

文件夹dir1将被忽略,不会被跟踪。跟踪文件夹dir2及其子文件。

你打电话给git干净。它将递归遍历文件夹dir1的内容并删除它们。这意味着它将通过联结进入dir2并删除那里的一个(跟踪)文件。然后出去,它将删除dir2交汇点和dir1文件夹。您只剩下一个空的dir2文件夹和.gitignore文件。

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


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工作树中使用联结。

© www.soinside.com 2019 - 2024. All rights reserved.