git clean не удаляет подмодуль, добавленный в ветку при переключении веток - PullRequest
26 голосов
/ 16 февраля 2012

Как избавиться от подмодулей при переключении веток.Я не понимаю, почему Git Clean говорит, что он удалил подмодуль, но не делает.Это ошибка?Ниже приведены шаги вырезать и вставить для воспроизведения.

git --version
git version 1.7.8.4

git init submod
cd submod
echo "This is a submodule" > README.txt
git add .
git commit -m "Initial commit"
cd ..
git init prog
cd prog
echo "This is a program" > README.txt
git add .
git commit -a -m "Initial commit"
git checkout -b topic1
git submodule add ../submod
git commit -m "Added submodule"

git checkout master
#warning: unable to rmdir submod: Directory not empty
#Switched to branch 'master'

git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       submod/
#nothing added to commit but untracked files present (use "git add" to track)

git clean -fd
#Removing submod/

git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       submod/
#nothing added to commit but untracked files present (use "git add" to track)

Ответы [ 2 ]

39 голосов
/ 26 мая 2012

Это не ошибка, это задокументированное поведение.From man git-clean:

Если неотслеживаемый каталог управляется другим хранилищем git, по умолчанию он не удаляется.

Каталог submod является другимgit хранилище;если вы хотите удалить его, Use -f option twice if you really want to remove such a directory.

git clean -f -f -d submod делает удалить submod.Смотрите мои шаги ниже (почти идентичные; другой git version и жестко заданный submodule путь, потому что в противном случае git плюет на пустышку).


Шаги


$ git --version
git version 1.7.5.4 # Note, different git-version. 

Создайте два хранилища


git init submod
cd submod
echo "This is a submodule" > README.txt
git add .
git commit -m "Initial commit"
cd ..
git init prog
cd prog
echo "This is a program" > README.txt
git add .
git commit -a -m "Initial commit"

Добавьте submod как git submodule в topic1 ветвь.


git checkout -b topic1
git submodule add /Users/simont/sandbox/SOTESTING/Subdir-testing/submod
git commit -m "Added submodule"

Теперь для интересного раздела.


$ git checkout master
warning: unable to rmdir submod: Directory not empty
Switched to branch 'master'

git status
# On branch master
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#       submod/
#nothing added to commit but untracked files present (use "git add" to track)

Попытка git-clean, затем на самом деле git-clean.


git clean -fd
#Removing submod/

git status
# On branch master
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#       submod/
#nothing added to commit but untracked files present (use "git add" to track)

$ # As we can see, we haven't actually removed anything yet. 
$ ls
README.txt  submod

$ git clean -f -f -d submod
Removing submod/

$ ls
README.txt

$ git status
# On branch master
nothing to commit (working directory clean)
3 голосов
/ 25 марта 2019

Чтобы удалить «оставшиеся» подмодули после проверки другой ветки, вы можете запустить следующее.Эта команда рекурсивно очистит основной репозиторий и все подмодули. Предупреждение: это также удалит все неотслеживаемые файлы.

git clean -xffd && git submodule foreach --recursive git clean -xffd

Чтобы увидеть, какие файлы будут удалены без фактического удаления, добавьте флаг -n.

git clean -nxffd && git submodule foreach --recursive git clean -nxffd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...