• Æ
    git-submodule foreach: Add $toplevel variable · f030c96d
    Ævar Arnfjörð Bjarmason 提交于
    Add a $toplevel variable accessible to `git submodule foreach`, it
    contains the absolute path of the top level directory (where
    .gitmodules is).
    
    This makes it possible to e.g. read data in .gitmodules from within
    foreach commands. I'm using this to configure the branch names I want
    to track for each submodule:
    
        git submodule foreach 'git checkout $(git config --file $toplevel/.gitmodules submodule.$name.branch) && git pull'
    
    For a little history: This patch is borne out of my continuing fight
    of trying to have Git track the branches of submodules, not just their
    commits.
    
    Obviously that's not how they work (they only track commits), but I'm
    just interested in being able to do:
    
        git submodule foreach 'git pull'
    
    Of course that won't work because the submodule is in a disconnected
    head, so I first have to connect it, but connect it *to what*.
    
    For a while I was happy with this because as fate had it, it just so
    happened to do what I meant:
    
        git submodule foreach 'git checkout $(git describe --all --always) && git pull'
    
    But then that broke down, if there's a tag and a branch the tag will
    win out, and I can't git pull a branch:
    
        $ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/master
        $ git tag -l
        release-0.0.6
        $ git describe --always --all
        release-0.0.6
    
    So I figured that I might as well start tracking the branches I want
    in .gitmodules itself:
    
        [submodule "yaml-mode"]
            path = yaml-mode
            url = git://github.com/yoshiki/yaml-mode.git
            branch = master
    
    So now I can just do (as stated above):
    
        git submodule foreach 'git checkout $(git config --file $toplevel/.gitmodules submodule.$name.branch) && git pull'
    
    Maybe there's a less painful way to do *that* (I'd love to hear about
    it). But regardless of that I think it's a good idea to be able to
    know what the top-level is from git submodule foreach.
    Signed-off-by: NÆvar Arnfjörð Bjarmason <avarab@gmail.com>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    f030c96d
git-submodule.txt 10.8 KB