Skip to content
  • Jens Lehmann's avatar
    submodule: teach rm to remove submodules unless they contain a git directory · 293ab15e
    Jens Lehmann authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    Currently using "git rm" on a submodule - populated or not - fails with
    this error:
    
    	fatal: git rm: '<submodule path>': Is a directory
    
    This made sense in the past as there was no way to remove a submodule
    without possibly removing unpushed parts of the submodule's history
    contained in its .git directory too, so erroring out here protected the
    user from possible loss of data.
    
    But submodules cloned with a recent git version do not contain the .git
    directory anymore, they use a gitfile to point to their git directory
    which is safely stored inside the superproject's .git directory. The work
    tree of these submodules can safely be removed without losing history, so
    let's teach git to do so.
    
    Using rm on an unpopulated submodule now removes the empty directory from
    the work tree and the gitlink from the index. If the submodule's directory
    is missing from the work tree, it will still be removed from the index.
    
    Using rm on a populated submodule using a gitfile will apply the usual
    checks for work tree modification adapted to submodules (unless forced).
    For a submodule that means that the HEAD is the same as recorded in the
    index, no tracked files are modified and no untracked files that aren't
    ignored are present in the submodules work tree (ignored files are deemed
    expendable and won't stop a submodule's work tree from being removed).
    That logic has to be applied in all nested submodules too.
    
    Using rm on a submodule which has its .git directory inside the work trees
    top level directory will just error out like it did before to protect the
    repository, even when forced. In the future git could either provide a
    message informing the user to convert the submodule to use a gitfile or
    even attempt to do the conversion itself, but that is not part of this
    change.
    
    Signed-off-by: default avatarJens Lehmann <Jens.Lehmann@web.de>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    293ab15e