С той же проблемой здесь. Упрощенная структура хранилища выглядит следующим образом:
repository
|
|--dir1
| |
| |--junc_dir2
|
|--dir2
| |
| |--file
|
|--.gitignore
В корне репо папки dir1 и dir2 и один файл .gitignore со следующим содержимым
dir1 # ignore dir1
Папка dir1 содержит NTFS-переход к dir2. Папка dir2 содержит файл.
Папка dir1 игнорируется и не отслеживается. Папка dir2 и ее дочерний файл отслеживаются.
Вы называете git clean. Он будет рекурсивно просматривать содержимое папки dir1 и удалять их. Это означает, что он пройдет через соединение в dir2 и удалит там один ( tracked ) файл. После этого он удалит перекресток dir2 и папку dir1. У вас останется только пустая папка dir2 и файл .gitignore.
Произошло со мной в контексте проекта node.js, который содержал несколько пакетов, ссылающихся на себя локально (используя npm i ../path/to/package). Смотри https://github.com/npm/npm/issues/19091