I added some Haml templates to my Rails 3 project with
git clone git://github.com/psynix/rails3_haml_scaffold_generator.git lib/generators/haml
only to find, when I tried to edit some of those files, that this was a submodule, so I couldn't commit changes that I made within the lib/generators/haml
directory. Now every time I git status
, I get
# 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")
but git add lib/generators/haml
has no effect. I really just want to have the files, not a submodule, but I'm finding the submodule impossible to get rid of:
> 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
Additional git add
s are useless. If I try git rm -rf lib/generators/haml
, I get
fatal: git rm: 'lib/generators/haml': Operation not permitted
It just won't die! I've looked up how to delete submodules, but in this case, there is no .submodules
file, nor is there any mention of the submodule in .git/config
. Yet if I run git submodule update
, I get
No submodule mapping found in .gitmodules for path 'lib/generators/haml'
I deleted the directory, but I get the same results! What's going on? Do I need to create a .gitmodules
file just to delete the submodule?
Submodules are now regarded as dirty if they have any modified files or untracked files, whereas previously it would only be the case if HEAD in the submodule pointed to the wrong commit.
Use the git submodule update command to set the submodules to the commit specified by the main repository. This means that if you pull in new changes into the submodules, you need to create a new commit in your main repository in order to track the updates of the nested submodules.
Git submodules may look powerful or cool upfront, but for all the reasons above it is a bad idea to share code using submodules, especially when the code changes frequently. It will be much worse when you have more and more developers working on the same repos.
In the context of the ignore = dirty setting for submodules, this means that if the submodule is dirty (i.e. if it has tracked files with modifications that have not been committed, and/or new untracked files), such changes will be ignored.
If there is no submodule, is it possible it (i.e. 'haml
') is actually not a submodule?
git clone git://github.com/psynix/rails3_haml_scaffold_generator.git lib/generators/haml
means: create lib/generators/haml
directory, and checkout in it the master branch of git://github.com/psynix/rails3_haml_scaffold_generator.git
.
The fact that you can do a git status
not from the root of your new repo ( lib/generators/haml
), but three levels above (where lib
is) means you have clone a repo within a repo.
Both repo can work independently, but you should add lib/generators/haml
to the .gitignore
of the parent repo (like in hits SO question).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With