diff --git a/Gemfile.lock b/Gemfile.lock
index 9240b75e86ca9b886d3b4430187e5364e22a779f..aa144739eec40a02389b0fb049d0de70d0d68842 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -289,6 +289,9 @@ GEM
       terminal-table (>= 1.5.1)
     globalid (1.2.1)
       activesupport (>= 6.1)
+    google-protobuf (4.27.0-arm64-darwin)
+      bigdecimal
+      rake (>= 13)
     google-protobuf (4.27.0-x86_64-darwin)
       bigdecimal
       rake (>= 13)
@@ -407,6 +410,8 @@ GEM
     net-smtp (0.5.0)
       net-protocol
     nio4r (2.7.3)
+    nokogiri (1.16.5-arm64-darwin)
+      racc (~> 1.4)
     nokogiri (1.16.5-x86_64-darwin)
       racc (~> 1.4)
     nokogiri (1.16.5-x86_64-linux)
@@ -643,6 +648,7 @@ GEM
     zlib (2.1.1)
 
 PLATFORMS
+  arm64-darwin-23
   x86_64-darwin-23
   x86_64-linux
 
diff --git a/app/models/communication/website/with_git_repository.rb b/app/models/communication/website/with_git_repository.rb
index 30623f9e5530669657606ddf6c730042922069b1..e15f3d4db1d65ba342740d7764dbe6c50e42ce77 100644
--- a/app/models/communication/website/with_git_repository.rb
+++ b/app/models/communication/website/with_git_repository.rb
@@ -35,9 +35,14 @@ module Communication::Website::WithGitRepository
 
   # Synchronisation optimale d'objet indirect
   def sync_indirect_object_with_git(indirect_object)
+    all_dependencies = []
     indirect_object.direct_sources.each do |direct_source|
-      add_direct_source_to_sync(direct_source)
+      all_dependencies = add_direct_source_to_sync(direct_source, array: all_dependencies)
     end
+    all_dependencies.each do |dependency|
+      Communication::Website::GitFile.sync self, dependency
+    end
+
     git_repository.sync!
   end
 
@@ -90,15 +95,18 @@ module Communication::Website::WithGitRepository
 
   protected
 
-  def add_direct_source_to_sync(direct_source)
+  def add_direct_source_to_sync(direct_source, array: [])
     # Ne pas traiter les sources d'autres sites
-    return unless direct_source.website.id == self.id
+    return array unless direct_source.website.id == self.id
     # Ne pas traiter les sources non synchronisables
-    return unless direct_source.syncable?
-    Communication::Website::GitFile.sync self, direct_source
-    direct_source.recursive_dependencies(syncable_only: true).each do |object|
-      Communication::Website::GitFile.sync self, object
-    end
+    return array unless direct_source.syncable?
+    # Ne pas traiter si la source directe est déjà dans le tableau de dépendances
+    return array if array.include?(direct_source)
+    array << direct_source
+    # On passe le tableau de dépendances à la méthode recursive_dependencies
+    # pour qu'il soit capable d'early return en cas de doublon
+    array += direct_source.recursive_dependencies(array: array, syncable_only: true)
     # On ne synchronise pas les références de l'objet direct, car on ne le modifie pas lui.
+    array
   end
 end
diff --git a/app/services/git/repository.rb b/app/services/git/repository.rb
index 079a622e17c20968996cd2d48dd9b69dfde7ae75..7ce91dfb1ab877c870133f7dc38c284b4dd20839 100644
--- a/app/services/git/repository.rb
+++ b/app/services/git/repository.rb
@@ -10,6 +10,7 @@ class Git::Repository
   end
 
   def add_git_file(git_file)
+    return if git_files.include?(git_file)
     puts "Adding #{git_file.path}"
     if git_files.empty?
       # The first file gives the commit name