I have a directory in my repo (call it blah
) which contains some files that I manualy copied from another repo (repo-blah
). One day, I decide to get smart and make this blah
directory a submodule, so that I don't have to manually recopy the files any time they change in repo-blah
, and so that I can make changes to those files in my repo and have a gitish way of updating repo-blah
.
I'd been working on the master branch, so I make another branch called sub-blah-branch
where I remove the blah directory from the index:
$ git rm -r blah
and then create a submodule for it:
$ git submodule add uri/to/repo-blah blah
I commit everything, and make sure the repo is clean:
$ git status
# On branch sub-blah-branch
nothing to commit (working directory clean)
Then, whilst feeling pretty cool about all this submodule stuff, I try to checkout the master branch. But I get this:
$ git checkout master
error: The following untracked working tree files would be overwritten by checkout:
blah/[every file that I had manually copied from repo-blah]
Please move or remove them before you can switch branches.
Aborting
Pro Git's chapter on submodules tells me that when switching from branches that have created submodules, the contents of those submodules aren't automatically removed, and instead become untracked once the repo switches branches. In this situation, I can't switch to master
without doing rm -rf
on the blah
directory first.
Is there a better way to deal with this problem?
I'm using git version 1.7.9.5
Pulling with submodules. Once you have set up the submodules you can update the repository with fetch/pull like you would normally do. To pull everything including the submodules, use the --recurse-submodules and the --remote parameter in the git pull command .
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.
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.
Cloning a Project with Submodules If you pass --recurse-submodules to the git clone command, it will automatically initialize and update each submodule in the repository, including nested submodules if any of the submodules in the repository have submodules themselves.
That seems expected, considering that those files are:
master
sub-blah-branch
So when you switch back in master
, git tries to remove the submodule entry (blah/
folder) from the index, which it can't since you have untracked files.
You have various way to proceed (in "error: The following untracked working tree files would be overwritten by checkout
- git")
But I would recommend either:
blah
folder in master
.blah
submodule directly in master
instead of in another branchMake sure, by the way, to properly initialize your submodule once you have declared it:
git submodule update --init
And don't forget you can make that submodule follow a branch of the upstream repo if you want:
see "Git submodules: Specify a branch/tag".
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