Невозможно избавиться от подмодуля 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.