# GIT : les pièges du travail collaboratif {{INLINETOC}} #Introduction ## Description du contexte root et jacques partagent le même répertoire local root utilise le remote origin pour tracker ses modifications LANG=en_GB git remote show origin * remote origin Fetch URL: user@xx.xx.xxx.xx:/home/gogs/gogs-repositories/jacques/kickstarts.git Push URL: user@xx.xx.xxx.xx:/home/gogs/gogs-repositories/jacques/kickstarts.git HEAD branch: master Remote branch: master tracked Local branch configured for 'git pull': master merges with remote master Local ref configured for 'git push': master pushes to master (up to date) jacques utilise le remote kickstarts pour tracker ses modifications sur le même repo distant git remote show kickstarts * distante kickstarts URL de rapatriement : http://xx.xx.xxx.xx:88/jacques/kickstarts.git URL push : http://xx.xx.xxx.xx:88/jacques/kickstarts.git Branche HEAD : master Branche distante : master suivi Référence locale configurée pour 'git push' : master pousse vers master (à jour) ## Problématique - root a fait des modifications avant jacques mais ne les a pas poussé vers le remote - jacques fait des modifications après root et veut faire un commit suivi d'un push immédiatement # Enchaînement des événements ## Interventions le jour J-1 root travaille sur deux fichiers puis il fait prépare un commit mais il ne pousse pas immédiatement ses modifications sur le remote: git status LANG=en_US git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD ..." to unstage) modified: README.md renamed: output.log -> testa mais il ne répercute pas immédiatement ces changements ni en local ni sur le remote ( le fichier output.log n'est donc pas renommé en testa) git ls-tree --full-tree master 100644 blob 87451e76f2d3a0a6dcbd95ace7df685277f410e8 README.md 100644 blob 078326eb0d15e4b8496e33e96ed856d3a2c8f9e9 kspbanal.cfg 100644 blob cd88e5bf538b1b53905065a232433f198a54f1f2 ksphyperkvm.cfg 100644 blob 05d77b68c13a72a68046f4ac034ddc050d9d1e16 kspmmadir.cfg 100644 blob 26c1a1db92b9d27f855f4f05a0c06ce0eaf180c9 ksporacle.cfg 100644 blob 3453da64bbcea3f2503ea5745ddf1e621a3a2ec8 ksppostgres.cfg 100644 blob 763089d27ab47484d4df988b11eebf5be192183d ksprmantina.cfg 100644 blob fcbe5c76d1bbc93f800fb16137485d782af79724 kspsillinux.cfg 100644 blob 3fc72f1dc4cb57160b7c5af0233c3b8d8bf1c65f kspwebssl.cfg 100644 blob 164b874c9949bf731c492338187d9b7278d6f581 kssbanal.cfg 100644 blob 869c499989797c6dac967db1f17a5636564f548e ksshyperkvm.cfg 100644 blob adc6554e726fbaf03465405f49ed071e213381e3 kssmmadir.cfg 100644 blob a539d71767b811d5ef246b80ade77e5974772ed6 kssoracle.cfg 100644 blob bdab216d5431183ce22cae0603d4ffb27a605eeb ksspostgres.cfg 100644 blob edda923a595737e53315dc62057aa1631a7c0ac7 kssrmantina.cfg 100644 blob fe08f00aea3234680007a56329e90fc8bdb03a13 ksssillinux.cfg 100644 blob 9d248bf9e7c4fa05ceb847fdc4c245169777f0af ksswebssl.cfg 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 output.log 100755 blob 9b935fef7fc6d606a87870d649a977e7c42445a8 test.sh ## Interventions le jour J ### jacques et root travaillent sur le même dépôt - jacques créé le fichier testb - root décide de supprimer le fichier testa en local mais ne veut pas le suprrimer immédiatement sur le remote L'état du dépôt local est maintenant modifé LANG=en_GB git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD ..." to unstage) modified: README.md renamed: output.log -> testa Changes not staged for commit: (use "git add/rm ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) deleted: testa Untracked files: (use "git add ..." to include in what will be committed) testb - Le fichier testb n'est pas encore suivi dans Git (pour cela il faut faire un add) - Le rename du fichier otput.log et les modifications de README.md vont être pris lors du prochain commit. ### jacques track ses modifications git add testb L'état du dépôt local est de nouveau modifié LANG=en_GB git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD ..." to unstage) modified: README.md renamed: output.log -> testa new file: testb Changes not staged for commit: (use "git add/rm ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) deleted: testa Le fichier testb sera tracké dans le prochain commit, mais la suppression par root du fichier testa intervenue reste en attente ### jacques tente de faire un push jaques veut immédiatement enregistré son travail, il fait un commit suivi d'un push vers le remote git commit -m "commit du 31 aout 2018" [master 37c0468] commit du 31 aout 2018 Committer: NOUGAT Jacques 3 files changed, 1 insertion(+), 1 deletion(-) rename output.log => testa (100%) create mode 100644 testb En l'état jacques ne peut pas faire un push sur la branche master du remote car il manque un bout de l'historique : - sur le remote le fichier renommé testa s'appelle toujours output.log - les modification de README.md n'ont toujours pas été prise en compte Le push de jacques échoue donc : git push kickstarts master Counting objects: 5, done. Delta compression using up to 2 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 345 bytes | 0 bytes/s, done. Total 3 (delta 1), reused 2 (delta 0) Username for 'http://xx.xx.xxx.xx:88': jacques Password for 'http://user@xx.xx.xxx.xx:88': error: unpack failed: unpack-objects abnormal exit To http://xx.xx.xxx.xx:88/jacques/kickstarts.git ! [remote rejected] master -> master (n/a (unpacker error)) error: impossible de pousser des références vers 'http://xx.xx.xxx.xx:88/jacques/kickstarts.git' ### root décide de valider ces premières modifications git push origin master user@xx.xx.xxx.xx's password: Counting objects: 5, done. Delta compression using up to 2 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 345 bytes | 0 bytes/s, done. Total 3 (delta 1), reused 2 (delta 0) To user@xx.xx.xxx.xx:/home/gogs/gogs-repositories/jacques/kickstarts.git cea665a..37c0468 master -> master Les opérations de root (sauf le delete de testa en attente ) sont répercutées mais également l'ajout par jacques de testb (car root et jacques utilisent le même repo local) git ls-tree --full-tree master 100644 blob 8d84c23f95f1de707399a9f55c32e0b12a70bf4b README.md 100644 blob 078326eb0d15e4b8496e33e96ed856d3a2c8f9e9 kspbanal.cfg 100644 blob cd88e5bf538b1b53905065a232433f198a54f1f2 ksphyperkvm.cfg 100644 blob 05d77b68c13a72a68046f4ac034ddc050d9d1e16 kspmmadir.cfg 100644 blob 26c1a1db92b9d27f855f4f05a0c06ce0eaf180c9 ksporacle.cfg 100644 blob 3453da64bbcea3f2503ea5745ddf1e621a3a2ec8 ksppostgres.cfg 100644 blob 763089d27ab47484d4df988b11eebf5be192183d ksprmantina.cfg 100644 blob fcbe5c76d1bbc93f800fb16137485d782af79724 kspsillinux.cfg 100644 blob 3fc72f1dc4cb57160b7c5af0233c3b8d8bf1c65f kspwebssl.cfg 100644 blob 164b874c9949bf731c492338187d9b7278d6f581 kssbanal.cfg 100644 blob 869c499989797c6dac967db1f17a5636564f548e ksshyperkvm.cfg 100644 blob adc6554e726fbaf03465405f49ed071e213381e3 kssmmadir.cfg 100644 blob a539d71767b811d5ef246b80ade77e5974772ed6 kssoracle.cfg 100644 blob bdab216d5431183ce22cae0603d4ffb27a605eeb ksspostgres.cfg 100644 blob edda923a595737e53315dc62057aa1631a7c0ac7 kssrmantina.cfg 100644 blob fe08f00aea3234680007a56329e90fc8bdb03a13 ksssillinux.cfg 100644 blob 9d248bf9e7c4fa05ceb847fdc4c245169777f0af ksswebssl.cfg 100755 blob 9b935fef7fc6d606a87870d649a977e7c42445a8 test.sh 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 testa 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 testb ### jacques tente de nouveau un push Si jacques fait un push ces modifications auront été embarquées dans le push de root git push kickstarts master Everything up-to-date donc plus rien n'est à faire ## Interventions le jour J+1 ### root décide de vaider le delete # Track du delete de testa git add --all LANG=en_GB git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD ..." to unstage) deleted: testa ### jacques peut poursuivre son travail normalement Maintenant si jacques refait un commit suivi d'un push ses modifications pourront être répecutées sur le remote # commit git commit -m "2eme commit du 31 aout 2018" [master 8ffca04] 2eme commit du 31 aout 2018 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 testa # suivi d'un push LANG=en_GB git push kickstarts master Counting objects: 3, done. Delta compression using up to 2 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (2/2), 255 bytes | 0 bytes/s, done. Total 2 (delta 1), reused 0 (delta 0) Username for 'http://xx.xx.xxx.xx:88': jacques Password for 'http://user@xx.xx.xxx.xx:88': To http://xx.xx.xxx.xx:88/jacques/kickstarts.git 37c0468..8ffca04 master -> master On voit désormais sur le remote que tous les changements ont été trackés git ls-tree --full-tree master 100644 blob 8d84c23f95f1de707399a9f55c32e0b12a70bf4b README.md 100644 blob 078326eb0d15e4b8496e33e96ed856d3a2c8f9e9 kspbanal.cfg 100644 blob cd88e5bf538b1b53905065a232433f198a54f1f2 ksphyperkvm.cfg 100644 blob 05d77b68c13a72a68046f4ac034ddc050d9d1e16 kspmmadir.cfg 100644 blob 26c1a1db92b9d27f855f4f05a0c06ce0eaf180c9 ksporacle.cfg 100644 blob 3453da64bbcea3f2503ea5745ddf1e621a3a2ec8 ksppostgres.cfg 100644 blob 763089d27ab47484d4df988b11eebf5be192183d ksprmantina.cfg 100644 blob fcbe5c76d1bbc93f800fb16137485d782af79724 kspsillinux.cfg 100644 blob 3fc72f1dc4cb57160b7c5af0233c3b8d8bf1c65f kspwebssl.cfg 100644 blob 164b874c9949bf731c492338187d9b7278d6f581 kssbanal.cfg 100644 blob 869c499989797c6dac967db1f17a5636564f548e ksshyperkvm.cfg 100644 blob adc6554e726fbaf03465405f49ed071e213381e3 kssmmadir.cfg 100644 blob a539d71767b811d5ef246b80ade77e5974772ed6 kssoracle.cfg 100644 blob bdab216d5431183ce22cae0603d4ffb27a605eeb ksspostgres.cfg 100644 blob edda923a595737e53315dc62057aa1631a7c0ac7 kssrmantina.cfg 100644 blob fe08f00aea3234680007a56329e90fc8bdb03a13 ksssillinux.cfg 100644 blob 9d248bf9e7c4fa05ceb847fdc4c245169777f0af ksswebssl.cfg 100755 blob 9b935fef7fc6d606a87870d649a977e7c42445a8 test.sh 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 testb # Conclusion On voit que le partage du dépôt local est dangereux car jacques est resté bloqué jusqu'à ce que root enregistre les modifications antérieures à l'intervent ion de jacques