Невозможно избавиться от подмодуля git

Я добавил некоторые шаблоны Haml для моего проекта Rails 3 с помощью

git clone git://github.com/psynix/rails3_haml_scaffold_generator.git lib/generators/haml

только для того, чтобы найти, когда я попытался отредактировать некоторые из этих файлов, это был подмодуль, поэтому я не мог зафиксировать изменения, внесенные в каталог lib/generators/haml. Теперь каждый раз, когда я git status, я получаю

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   lib/generators/haml
#
no changes added to commit (use "git add" and/or "git commit -a")

но git add lib/generators/haml не действует. Я просто хочу иметь файлы, а не подмодуль, но я не могу избавиться от подмодуля:

> git rm --cached lib/generators/haml
rm 'lib/generators/haml'
> git status

# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    lib/generators/haml
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   lib/generators/

> git commit -m "Removed submodule"

[master 02ae4c7] Removed submodule
 1 files changed, 0 insertions(+), 1 deletions(-)
 delete mode 160000 lib/generators/haml

> git status

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   lib/generators/
nothing added to commit but untracked files present (use "git add" to track)

> git add lib/generators/haml
> git status

# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   lib/generators/haml
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   lib/generators/haml

> git commit -m "Re-added lib/generators/haml"

[master c966912] Re-added lib/generators/haml
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 160000 lib/generators/haml

> git status

# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   lib/generators/haml

Дополнительные git add бесполезны. Если я попробую git rm -rf lib/generators/haml, я получаю

fatal: git rm: 'lib/generators/haml': Operation not permitted

Он просто не умрет! Я просмотрел как удалить подмодули, но в этом случае нет файла .submodules, и нет упоминания о подмодуле в .git/config. Но если я запустил git submodule update, я получаю

No submodule mapping found in .gitmodules for path 'lib/generators/haml'

Я удалил каталог, но получаю те же результаты! Что происходит? Мне нужно создать файл .gitmodules только для удаления подмодуля?

Ответы

Ответ 1

Если подмодуль отсутствует, возможно ли, что он (т.е. 'haml') на самом деле не является подмодулем?

git clone git://github.com/psynix/rails3_haml_scaffold_generator.git lib/generators/haml

означает: создать каталог lib/generators/haml и проверить в нем главную ветвь git://github.com/psynix/rails3_haml_scaffold_generator.git.

Тот факт, что вы можете сделать git status не из корня вашего нового репо (lib/generators/haml), но три уровня выше (где lib) означает, что вы клонировали репо в репо.

Оба репо могут работать независимо, но вы должны добавить lib/generators/haml в .gitignore родительского репо (например, в образах вопрос SO).

Ответ 2

Подмодуль отображается в статусе git как измененный, если он имеет необработанные файлы. Если вы вызываете git diff lib/generators/haml, вы, скорее всего, увидите что-то вроде этого:

diff --git a/lib/generators/haml b/lib/generators/haml
index 3019fec..653c59a 160000
--- a/lib/generators/haml
+++ b/lib/generators/haml
@@ -1 +1 @@
-Subproject commit 653c59ad72925c9ccbde67e8e484e15d4b6dd25d
+Subproject commit 653c59ad72925c9ccbde67e8e484e15d4b6dd25d-dirty

Это означает, что внутри этого подмодуля остаются некоторые незатребованные файлы. Они не могут быть добавлены через команды в родительском проекте; вместо этого вы должны пройти в сабмодуль и добавить их (или добавить записи в .gitignore)... Или вы можете просто игнорировать сообщение о состоянии.

Последняя версия git (1.7.1, я думаю) показывает эту информацию в статусе:

# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   lib/generators/haml (untracked content)

Ответ 3

Вы могли бы использовать:

git add lib/generators/haml/

чтобы добавить файлы в подмодуль к HEAD и удалить подмодуль. Но опять же это может не сработать, потому что у вас действительно нет подмодуля.

Обратите внимание, что после пути есть конечная косая черта. Если вы поместите этот git, удалите подмодуль и поместите его в HEAD, в отличие от:

git add lib/generators/haml

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