User Tools

Site Tools


notes:git-local-partage

GIT : les pièges du travail collaboratif

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 <file>..." 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 <file>..." to unstage)

	modified:   README.md
	renamed:    output.log -> testa

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	deleted:    testa

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	testb
  1. Le fichier testb n'est pas encore suivi dans Git (pour cela il faut faire un add)
  2. 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 <file>..." to unstage)

	modified:   README.md
	renamed:    output.log -> testa
	new file:   testb

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." 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 <jacques.nougat@M013E13P-1249185.dgfip>

 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 <file>..." 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

notes/git-local-partage.txt · Last modified: 2025/02/19 10:59 by 127.0.0.1