git clean is not removing a submodule added to a branch when switching branches

前端 未结 2 2100
一向
一向 2020-12-14 01:01

How do I get rid of submodules when switching branches. I do not understand why git clean says it removed the submodule but does not. Is this a bug? Below are cut&paste

相关标签:
2条回答
  • This isn't a bug, it's documented behaviour. From man git-clean:

    If an untracked directory is managed by a different git repository, it is not removed by default.

    The submod directory is a different git repository; if you want to remove it, Use -f option twice if you really want to remove such a directory.

    git clean -f -f -d submod does remove submod. See my steps below (almost identical; different git version and hard-coded submodule path because otherwise git spits the dummy).


    Steps

    
    $ git --version
    git version 1.7.5.4 # Note, different git-version. 
    

    Make the two repositories

    
    git init submod
    cd submod
    echo "This is a submodule" > README.txt
    git add .
    git commit -m "Initial commit"
    cd ..
    git init prog
    cd prog
    echo "This is a program" > README.txt
    git add .
    git commit -a -m "Initial commit"
    

    Add submod as a git submodule in topic1 branch.

    
    git checkout -b topic1
    git submodule add /Users/simont/sandbox/SOTESTING/Subdir-testing/submod
    git commit -m "Added submodule"
    

    Now for the interesting section.

    
    $ git checkout master
    warning: unable to rmdir submod: Directory not empty
    Switched to branch 'master'
    
    git status
    # On branch master
    # Untracked files:
    #   (use "git add ..." to include in what will be committed)
    #
    #       submod/
    #nothing added to commit but untracked files present (use "git add" to track)
    

    Attempt to git-clean, then actually git-clean.

    
    git clean -fd
    #Removing submod/
    
    git status
    # On branch master
    # Untracked files:
    #   (use "git add ..." to include in what will be committed)
    #
    #       submod/
    #nothing added to commit but untracked files present (use "git add" to track)
    
    $ # As we can see, we haven't actually removed anything yet. 
    $ ls
    README.txt  submod
    
    $ git clean -f -f -d submod
    Removing submod/
    
    $ ls
    README.txt
    
    $ git status
    # On branch master
    nothing to commit (working directory clean)
    
    0 讨论(0)
  • 2020-12-14 01:39

    To remove the "leftover" submodules after checking out a different branch, you can run the following. This command will recursively clean the main repository and all submodules. Warning: this will remove all untracked files as well.

    git clean -xffd && git submodule foreach --recursive git clean -xffd
    

    To see which files will be deleted without actually deleting yet, add the -n flag.

    git clean -nxffd && git submodule foreach --recursive git clean -nxffd
    

    Key to the command is the double-f passed to Git clean. Without that, Git will not remove folders that are a submodule (i.e. folders containing a .git subfolder).

    0 讨论(0)
提交回复
热议问题