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
Vous devez être connecté pour poster un message !
Recevoir les derniers articles gratuitement en créant un compte !
S'inscrire
Commentaires