2016-12-22 2 views
0

J'ai cette configuration pour le sous-module dans le fichier de .gitmodules:Git - sous-modules HEAD est toujours détaché après l'exécution de la mise à jour?

[submodule "sub"] 
    shallow = true 
    branch = master 
    path = sub 
    url = https://path/to/repo.git 

Maintenant, je veux quand quelqu'un clone mon repo puis exécute ces commandes:

git submodule init 
git submodule update 

est d'obtenir la branche principale peu profonde du sous-module. Mais ce qui se passe, c'est qu'il ne vérifie pas à master branche. Il arrivera toujours à la tête détachée, alors j'ai besoin de lancer manuellement git checkout master. Ainsi, au lieu de ces deux commandes, l'utilisateur doit en exécuter une de plus.

J'ai regardé ceci: Why is my GIT Submodule HEAD detached from master?

Mais aucun conseil qui était sur les réponses acceptées, ne semble pas aider: j'ajouté branche que je veux dans le fichier .gitmodules, j'ajouté à distance en amont pour être maître (cela ne fonctionne que pour référentiel déjà cloné/mis à jour après avoir dû checkout pour me maîtriser).

Est-ce que cela a pour but de toujours obtenir une tête détachée si quelqu'un clone mon dépôt et veut configurer le sous-module?

+0

Oui, 'git submodule update' crée toujours un HEAD détaché pour le (s) sous-module (s). C'est très ennuyant quand vous voulez faire du développement dans les sous-modules alors qu'ils sont en sous-module (au lieu de les vérifier ailleurs). Vous devrez vous rappeler de faire d'abord un checkout nom_branche avant de travailler, et après avoir validé retourner au projet parent pour ajouter le changement. Je suis également à la recherche d'une solution pour automatiser cela plus facilement. –

Répondre

0

J'enquęte encore, mais voici le script que je suis venu avec et je utilise maintenant:

#! /bin/bash                                             
# Written by Carlo Wood 2016                                         

echo "In \"$(pwd)\", entering $0 $*"                                       

# This script should be run from the root of the parent project.                                
if ! test -e .git; then                                          
    echo "$0: $(pwd) is not a git repository."                                     
    exit 1                                              
fi                                               

# Parse command line parameters.                                        
opt_init=                                              
opt_recursive=                                            
do_foreach=0                                             
initial_call=1                                            
while [[ $# -gt 0 ]]                                           
do                                               
    case $1 in                                             
    --init)                                             
     opt_init=$1                                            
     ;;                                              
    --recursive)                                            
     opt_recursive=$1                                          
     do_foreach=1                                           
     ;;                                              
    --reentry) 
     initial_call=0 
     ;; 
    --) 
     break; 
     ;; 
    -*) 
     echo "Unknown option $1" 
     exit 1 
     ;; 
    *) 
     break 
     ;; 
    esac 
    shift 
done 

# Determine the full path to this script. 
if [[ ${0:0:1} =/]]; then 
    FULL_PATH="$0" 
else 
    FULL_PATH="$(realpath $0)" 
fi 

if test "$initial_call" -eq 1; then 
    do_foreach=1 
else 
    # Script is called from git submodule foreach ...' 
    name="$1" 
    path="$2" 
    sha1="$3" 
    toplevel="$4" 
    # Make sure we are in the right directory. 
    cd "$toplevel/$path" || exit 1 
    # Does the parent project want us to checkout a branch for this module? 
    SUBMODULE_BRANCH=$(git config -f "$toplevel/.gitmodules" submodule.$name.branch) 
    if test -n "$SUBMODULE_BRANCH"; then 
    echo "Calling 'git checkout $SUBMODULE_BRANCH' in $(pwd)" 
    git checkout $SUBMODULE_BRANCH || exit 1 
    echo "Calling 'git pull' in $(pwd)" 
    git pull || exit 1 
    if test $(git rev-parse HEAD) != "$sha1"; then 
     # Update the parent project to point to the head of this branch. 
     pushd "$toplevel" >/dev/null 
     SN1=$(git stash list | grep '^stash' | wc --lines) 
     git stash save --quiet Automatic stash of parent project by update_submodules.sh 
     SN2=$(git stash list | grep '^stash' | wc --lines) 
     git add $name 
     git commit -m "Update of submodule $name to current $SUBMODULE_BRANCH" 
     if test $SN1 -ne $SN2; then 
     git stash pop --quiet 
     fi 
     popd >/dev/null 
    fi 
    elif test $(git rev-parse HEAD) != "$sha1"; then 
    # No submodule.$name.branch for this submodule. Just checkout the detached HEAD. 
    git checkout $sha1 
    fi 
fi 

echo "do_foreach=$do_foreach; opt_init=$opt_init; opt_recursive=$opt_recursive; name=$name; path=$path; sha1=$sha1; toplevel=$toplevel; pwd=$(pwd)" 

if test $do_foreach -eq 1; then 
    if test -n "$opt_init"; then 
    echo "Calling 'git submodule init'" 
    git submodule init 
    fi 
    # Make sure the submodules even exist. 
    echo "Calling 'git submodule update'" 
    git submodule update 
    # Call this script recursively for all submodules. 
    echo 'Calling '"'"'git submodule foreach '"$FULL_PATH --reentery $opt_init $opt_recursive"' $name $path $sha1 $toplevel'"'" 
    git submodule foreach "$FULL_PATH --reentry $opt_init $opt_recursive"' $name $path $sha1 $toplevel' 
fi 

Appeler ce script fera la même chose que « mise à jour du sous-module git » et même supports --init et --recursive. Cependant, vous pouvez configurer les sous-modules à la caisse et tirer une branche à la place en définissant une valeur 'branch'; par exemple: git config -f .gitmodules submodule.NAME.branch master entraînera le sous-module NAME à extraire et tirer le maître de branche à la place de SHA1 actuel. Il mettra également à jour le projet parent pour qu'il pointe vers la HEAD de cette branche.