Git submodule add: "a git directory is found locally" issue
Asked Answered
E

8

357

I'm actually trying to learn how to use git, including the git submodule subcommands. I already set up a server on which I can host, push and pull git repositories by using SSH. I created a main git repository "Travail" on this server in which I would like to put all my projects as submodules.

In my Travail repository, I already added a project of mine as a submodule at tools/libft: I'm able to develop this submodule, to push and to pull it.

But when I try to add another submodule (named fdf, from fdf.git on my server), I get the following issue :

git submodule add ssh://XXX.XXX.XXX.XXX:XXXXX/opt/git/fdf.git projets/fdf

A git directory for 'projets/fdf' is found locally with remote(s): origin ssh://[email protected]:XXXXX/opt/git/fdf.git If you want to reuse this local git directory instead of cloning again from ssh://XXX.XXX.XXX.XXX:XXXXX/opt/git/fdf.git use the '--force' option. If the local git directory is not the correct repo or you are unsure what this means choose another name with the '--name' option.

There is actually no subdirectory in projets/

I read on another thread that I should use git submodule sync or edit the .gitmodules file in which the URL to my submodule's origin repository could have changed.

But my .gitmodules file only contains the information about my first submodule (tools/libft), not about projets/fdf :

[submodule "tools/libft"]
    path = tools/libft
    url = ssh://[email protected]:XXXXX/opt/git/libft.git

As a French student I could have missed something in the English documentation I have, but I searched and I really don't understand why I get this issue.

I would be glad if I would get a solution but just an explanation would be helpful too.

Expenditure answered 5/1, 2014 at 2:32 Comment(8)
A small correction: it's 'repository', not 'depository'. Not really an answer, but if the projects are independent of each other it would be better for each project to have its own repo instead of submodules.Yoghurt
Thank you, I corrected. I know but I would like to gather all my work in the same repo but as separate projects. It is a choice to keep my whole work updated when I go from home to my school and vice versa (and to learn how to use these tools, I'm curious ;) )Expenditure
Well, curiosity is always a good reason! :) That is strange. Are you sure you haven't added the submodule before?Yoghurt
Not in Travail/, and I have no problème to clone fdf.git in ~/ . In Travail/ I find no traces of fdf. just libft :/Expenditure
Oh wait, I looked in /Travail/.git/modules/projets/ and I found a fdf directory. This seems to not be in the working tree but in older commits. Could it generate the issue?Expenditure
Yes, possibly. So it was committed in the main project?Yoghurt
related: #12898778Barden
Possible duplicate of How do I replace a git submodule with another repo?Handsaw
C
862

I came to this SO post trying to add a submodule with the same path as a submodule that I recently deleted.

This is what ultimately worked for me (this article helped out a lot):

If you haven't already run
git rm --cached path_to_submodule (no trailing slash) as well as
rm -rf path_to_submodule

Then:

  1. Delete the relevant lines from the .gitmodules file. e.g. delete these:
[submodule "path_to_submodule"]
        path = path_to_submodule
        url = https://github.com/path_to_submodule
  1. Delete the relevant section from .git/config. e.g. delete these:
[submodule "path_to_submodule"]
        url = https://github.com/path_to_submodule
  1. rm -rf .git/modules/path_to_submodule

Then, you can finally:

git submodule add https://github.com/path_to_submodule

Cabriole answered 3/3, 2016 at 16:48 Comment(6)
Make sure your submodule directory is not in your .gitignoreStable
I had to remove .git/modules/module_name to get it workingZahavi
In my case I also had to close and open a new bash window, something was stored in memory!Flaw
@Cabriole why git rm --cached path_to_submodule? I would git rm without cached.Revanchism
This looks like a bug in git, because you can't solve it within git command scope, you will have to call rm ./git/modules/path, which is especially painful in a CI environment. And even locally, you have to do this every time you checkout between those branches. Is there any approach that can solve this within git command? something like parameter with --no-keep-directory that will clean .git/modules/path/to/module?Ryley
This is why I hate git..., why not have a git submodule remove command?Gans
H
92

i tried jbmilgrom's solution, specifically i tried git rm --cache and that didn't work for me either as the directory/submodule wasn't there. What worked for me was:

  1. rm -rf .git/modules/blah
  2. git submodule add git://path.to.new

I did this after trying --force within the git submodule commands and rm all the other directories, pushes to master etc... the directory didn't exist and there was no reason for the cache. Turns out in .git/modules that is where this error was lying.

Harbird answered 17/7, 2016 at 11:6 Comment(1)
This is the solution I used. The others did not work for me because the directory wasn't there on the disk, because git actually failed to clone the submodule properly (the remote repo had no branches, therefore git could not clone it. Or something.)Brasil
Q
21

If you already deleted the submodule directory, like I did, follow the rest of jbmilgrom's instructions. The key is rm -rf .git/modules/path_to_submodule but go ahead and backup your whole parent repo directory first.

If you only had one submodule just delete .gitmodules

Quartus answered 7/2, 2017 at 21:11 Comment(0)
D
17

You may have deleted your 'projets/fdf' from disk, but your Git repository still has it. Use git rm -rf projets/fdf to remove it from Git, then commit the changes. After that you'll be able to add this folder as a submodule.

Daniel answered 5/1, 2014 at 4:6 Comment(12)
It worked :) Thank you. I think I actually made this mistake.Expenditure
I was searching a git submodule rm command, but there is no such command? isn't it?Expenditure
@Expenditure No, there isn't. But you can use this workflow or, for example, git delete-submodule command from git-extras package by TJ Holowaychuk.Daniel
@Expenditure Also, it's a good practice in general to accept the right answer, so the other people could see it right away. ;)Daniel
That's right ;) But I didn't yet know how to do (it was my first question) Thanks for the explanations!Expenditure
I get told the directory doesn't exist when I do this. Seems it both exists and doesn't :/Genna
Same problem here, directory doesn't exists, can't git rm -rf it and can't add new submoduleCommodious
@Commodious Did you figure this out? I'm dealing with the same problemHandedness
@tom-mcfarlin In the end, Imanually removed lines from .gitmodule and a folder from .git/modules, then it let me add a new submodule. Maybe there's better way to do this, but I was running out of time. If you gonna go this way, I recommend you make a good backup and please don't blame me, if it goes wrong for you. Good luck.Commodious
Thank you, I found on another post to remove the folder from .git/modules and that worked for me. Makes sense as that's what the error said was the conflict... I just was unaware of that folderHandedness
@NathanHornby @Sparklos @TomMcFarlin -- In more recent versions of git, you will find that git-submodule adds a directory in .git folder. For example, if you are in directory /tmp/repo, then run git submodule add ../otherrepo.git, then you will see that /tmp/repo/.git/modules/otherrepo folder exists. That is what the problem was for me. I manually deleted that folder from .git, and everything worked.Cardon
This isn't the correct answer. It doesn't remove the submodule completely. The answer by @Cabriole coveres the problem in detail.Onstad
C
10

These two commands works for me.

rm path/to/submodule -rf
rm .git/modules/path/to/module -rf
Cocoa answered 28/1, 2019 at 3:5 Comment(1)
This. It seems there are two ways for submodules to be created. In one of them, the subfolder will only have a single .git file that simply points to a directory in the superproject, starting with .git/modules/. In there is a folder that stores the repository for the submodule. Deleting that repository fixed the issue for me, while the accepted answer didn't.Geiss
M
1

You can do this while cloning your submodule:

git submodule add --name submodule_name submodule path

This will add your submodule into your project and will be added as a structure under .gitmodules file.

And then if you don't want the older one you can remove it from .gitmodules structure and delete the submodule folder from the project.

Mastin answered 11/12, 2020 at 14:21 Comment(0)
M
1

I added an empty submodule (no files, branches) and tried the commands in the other answers to delete it.

However, while the files were deleted, the local git directory remained, so I had to go to the .git folder and manually delete the submodule from .git/modules/SUBMODULE-PATH, which finally resolved this error and got git submodule add to work.

The .git folder is hidden. On Windows, you can enable "Hidden items" under View in File Explorer and then access it from the root folder.

Manteau answered 7/4, 2023 at 4:16 Comment(0)
I
0

Had the same issue, and this did the trick for me:

# force register the submodule in .gitmodules
git submodule add -f <name> <path>

# force git to update cached submodule configs
git submodule sync --recursive

From the docs:

sync [--recursive] [--] [...]

Synchronizes submodules' remote URL configuration setting to the value specified in .gitmodules. It will only affect those submodules which already have a URL entry in .git/config (that is the case when they are initialized or freshly added). This is useful when submodule URLs change upstream and you need to update your local repositories accordingly.

The issue is that, despite your .gitmodules file being updated, the underlying config .git/modules/tools/libft is still pointed at the old submodule URL.

The other solutions recommending you rm -rf .git/modules/<repo> are just deleting the config that git submodule sync updates for you.

Improvisator answered 9/7, 2022 at 17:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.