Sujet :

git lfs est très long

RÉSOLU

Liste des sujets Répondre Créer un sujet

Zahia-Ameziani

Membre depuis le 25/02/2025

Nous avons un serveur Git LFS auto-hébergé qui utilise un bucket S3 d’AWS comme stockage, contenant environ 700 Go de données.J'ai 20 serveurs clients en lecture seule qui utilisent un script pour récupérer les données depuis ce serveur Git.
Voici l'architecture actuelle :
dev-team (commit/push) ----> Serveur Git LFS auto-hébergé(AWS) <----> (Données stockées sur S3) ----> 20 instances EC2 clientes exécutant script.sh pour récupérer les données
Ancienne architecture avec SVN :
dev-temps (commit/push) ----> Serveur SVN auto-hébergé(AWS) <---- 20 instances EC2 clientes exécutant script.sh avec rsync pour synchroniser les données

 Nous avons abandonné SVN car rsync prenait trop de temps pour synchroniser les 700 Go de données : il vérifiait chaque fichier avant de mettre à jour les fichiers modifiés, ce qui entraînait des délais importants. En passant à Git LFS, l'objectif était de réduire le temps de synchronisation, car Git est censé ne récupérer que les différences entre les versions.
- Problèmes rencontrés :
La synchronisation avec Git LFS prend plus de 4 heures, ce qui est inacceptable, d'autant plus que rsync effectuait cette tâche en 5 à 10 minutes.
Le script actuel devrait uniquement télécharger les fichiers modifiés, mais cela ne semble pas fonctionner comme prévu.
- voici les 2 scripts utilisés :
rsynchMotionRessources.sh : Prend plus de 4 heures pour s'exécuter.

MOTION_DIR=/Users/ec2-user/Motion_Design
useGit() {
    echo "Using Git"
    init() {
        git config --global pull.rebase true
        git config --global credential.helper store
    }

    init_submodules() {
        echo "Started pulling modules at $(date +'%H:%M:%S')"
        git submodule update --init --recursive || { echo "ERROR : Git submodule update failed: $(date +'%H:%M:%S')"; exit 1; }
    }

    clone() {
        echo "Started cloning at $(date +'%H:%M:%S')"
        echo "Process will take a while"
        rm -rf "$MOTION_DIR"
        git clone --depth=1 "https://oauth2:$MOTION_TOKEN@$GITLAB_ENDPOINT/Motion/$REPO.git" "$MOTION_DIR" --progress || { echo "ERROR : Cloning failed: $(date +'%H:%M:%S')"; exit 1; }
        cd "$MOTION_DIR" || exit 1
        init_submodules
    }

    pull() {
      clean() {
        rm -rf "/Users/ec2-user/Motion_Design/.git/modules/Ressources/index.lock"
        rm -rf "/Users/ec2-user/Motion_Design/.git/index.lock"
      }

      pullDir() {
        cd "$1" || exit
        git reset --hard
        git checkout main
        git pull -X theirs origin main
      }

      clean
      echo "started Pulling at $(date +'%H:%M:%S')"
      pullDir "$MOTION_DIR"
      pullDir "$MOTION_DIR/Ressources"
    }

    if [ ! -d "$MOTION_DIR/.git" ]; then
        clone
    else
        cd "$MOTION_DIR" || exit 1
        pull
    fi
}

# Use Git by default
useGit


revised_rsynchMotionRessources.sh : Ne télécharge que les fichiers LFS sans les données (seulement des métadonnées, pas les fichiers originaux).

MOTION_DIR=/Users/ec2-user/Motion_Design
useGit() {
    echo "Using Git"
    init() {
        git config --global pull.rebase true
        git config --global credential.helper store
    }
    init_submodules() {
        echo "Started pulling modules at $(date +'%H:%M:%S')"
        git submodule update --init --recursive || { echo "Error: Git submodule update failed: $(date +'%H:%M:%S')"; exit 1; }
    }
    clone() {
        echo "Started cloning at $(date +'%H:%M:%S')"
        echo "Process will take a while"
        rm -rf "$MOTION_DIR"
        git clone --depth=1 "https://oauth2:$MOTION_TOKEN@$GITLAB_ENDPOINT/Motion/$REPO.git" "$MOTION_DIR" --progress || { echo "Error: Cloning failed: $(date +'%H:%M:%S')"; exit 1; }
        cd "$MOTION_DIR" || exit 1
        init_submodules
    }
    pull() {
        echo "Started fetching at $(date +'%H:%M:%S')"
        export GIT_LFS_SKIP_SMUDGE=1
        git fetch --depth=1 origin main --progress || { echo "Error: Git fetch failed at $(date +'%H:%M:%S')"; exit 1; }
        git reset --hard origin/main || { echo "Error: Git reset failed at $(date +'%H:%M:%S')"; exit 1; }

        export CHANGED_FILES=$(git diff --name-status --diff-filter=AMRDCT origin/main HEAD)
        echo "Changed files: $CHANGED_FILES"
        IFS=$'\n' read -rd '' -a FILE_ARRAY <<< "$CHANGED_FILES"

        for file in "${FILE_ARRAY[@]}"; do
            file_status=$(echo "$file" | awk '{print $1}')
            old_file=$(echo "$file" | awk '{print $2}')
            new_file=$(echo "$file" | awk '{print $3}')

            if [ "$file_status" == "R" ]; then
                git checkout origin/main -- "$new_file" || { echo "Error: Failed to checkout renamed file $new_file"; exit 1; }
                [ -f "$old_file" ] && git rm "$old_file"
            elif [ "$file_status" == "D" ]; then
                [ -f "$old_file" ] && git rm "$old_file"
            elif [ "$file_status" == "A" ] || [ "$file_status" == "M" ]; then
                git checkout origin/main -- "$old_file"
            elif [ "$file_status" == "C" ]; then
                git checkout origin/main -- "$new_file"
            elif [ "$file_status" == "T" ]; then
                git checkout origin/main -- "$old_file"
            fi
        done
    }
    if [ ! -d "$MOTION_DIR/.git" ]; then
        clone
    else
        cd "$MOTION_DIR" || exit 1
        pull
    fi
}
useGit

Répondre

vous devez être connecté pour poster un message !

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire