From 9422ddebb9ae1ad17e75f4ef3a6f7226fca5d79f Mon Sep 17 00:00:00 2001 From: eleonore12345 Date: Tue, 23 Jul 2024 21:34:37 +0200 Subject: [PATCH] initialization --- .~lock.notes.odt# | 1 - development_explanation.odt | Bin 41350 -> 0 bytes .../developement_explanations_fr.md | 56 +- doc/development_explanations.md | 270 +++++ explications_developpement.odt | Bin 41619 -> 0 bytes git_update.sh | 80 -- notes.odt | Bin 98198 -> 0 bytes performance_tests.sh | 1041 ----------------- readme | 31 +- src/git_update.sh | 139 +-- src/pre-push | 16 - creation_repo.sh => test/creation_repo.sh | 0 .../functional_tests/test_git_update.sh | 0 readme.md => test/performance_tests/readme | 0 tests-manuels/pourTesterGitUpdate | 1 - 15 files changed, 383 insertions(+), 1252 deletions(-) delete mode 100644 .~lock.notes.odt# delete mode 100644 development_explanation.odt rename texte_explicatif.txt => doc/developement_explanations_fr.md (80%) create mode 100644 doc/development_explanations.md delete mode 100644 explications_developpement.odt delete mode 100755 git_update.sh delete mode 100644 notes.odt delete mode 100755 performance_tests.sh delete mode 100755 src/pre-push rename creation_repo.sh => test/creation_repo.sh (100%) rename test_git_update.sh => test/functional_tests/test_git_update.sh (100%) rename readme.md => test/performance_tests/readme (100%) delete mode 160000 tests-manuels/pourTesterGitUpdate diff --git a/.~lock.notes.odt# b/.~lock.notes.odt# deleted file mode 100644 index 9f5f00a..0000000 --- a/.~lock.notes.odt# +++ /dev/null @@ -1 +0,0 @@ -,eleonore1,eleonore,24.06.2024 18:03,file:///home/eleonore1/.config/libreoffice/4; \ No newline at end of file diff --git a/development_explanation.odt b/development_explanation.odt deleted file mode 100644 index 73fbf014b881a866e87e43512002fe129883522e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41350 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

JS0X1_lo< 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 diff --git a/texte_explicatif.txt b/doc/developement_explanations_fr.md similarity index 80% rename from texte_explicatif.txt rename to doc/developement_explanations_fr.md index afb8b3b..9ce3eaf 100644 --- a/texte_explicatif.txt +++ b/doc/developement_explanations_fr.md @@ -7,9 +7,9 @@ Comment minimiser la consommation en ressources mémoire et flux de données d'u # Objectif - L’objectif est d'obtenir la dernière version (ou une version précise) d’un dépôt git, en utilisant le moins de ressources possible. Par ressources, on entend le flux de données qui part du remote pour arriver au dossier local, ainsi que la place mémoire occupée par le dépôt sur le serveur local. + L’objectif est d'obtenir la dernière version (ou une version précise) d’un dépôt git, en utilisant le moins de ressources possible. Par ressources, nous entendons le flux de données qui part du remote pour arriver au dossier local, ainsi que la place mémoire occupée par le dépôt sur le serveur local. - Le dépôt Git créé n'enverra aucune donnée au remote. Il n'aura aucune utilité de l'historique. Il pourra éventuellement conserver certains fichiers locaux en plus de ses clonages Git. En cas de conflit, le remote aura toujours raison. Il incluera les éventuels submodules. Il peut vouloir télécharger le dernier commit de HEAD( par défaut) ou bien un commit d'une certaine référence, c'est-à-dire branche ou tag. + Le dépôt Git créé n'enverra aucune donnée au remote. Il aura accès aux tags mais pas à l'historique. Il pourra éventuellement conserver certains fichiers locaux non-tracés en plus de ses clonages Git. Il incluera les éventuels submodules. Il peut vouloir télécharger le dernier commit de main (par défaut) ou bien un commit d'une certaine référence, c'est-à-dire branche ou tag. # Procédé @@ -32,13 +32,22 @@ git clone --depth=1 --recurse-submodules --remote-submodules ## Pour mettre à jour : +git fetch --tags --depth=1 --prune --prune-tags origin $ref +git reset --hard --recurse-submodules FETCH_HEAD git submodule update --init --recursive --force --depth=1 --remote -git fetch --tags --depth=1 --prune --prune-tags origin -git reset --hard origin/main git reflog expire --expire=now --all git gc --aggressive --prune=now [git clean -qfdx] + git fetch --tags --depth=1 --prune --prune-tags origin + + tags permet de fetch les tags, elle doit être précisée y compris si un tag est fetched par référence + depth=1 permet de considérer uniquement le dernier commit + prune permet de supprimer du dossier remote en local les références qui ne sont plus accessibles + prune-tags permet non seulement de supprimer du dossier remote en local les références qui ne sont plus accessibles, mais aussi de supprimer les tags locaux qui n'existent pas sur le remote + + git reset --hard --recurse-submodules origin/main + git submodule update --init --recursive --force --depth=1 --remote init met à jour le fichier .gitmodules @@ -46,19 +55,11 @@ git gc --aggressive --prune=now force permet d'ignorer les changements locaux aux submodules et d'automatiquement check out la nouvelle version depth=1 permet de considérer uniquement le dernier commit du submodule remote permet de mettre à jour depuis le remote submodule originel - - git fetch --tags --depth=1 --prune --prune-tags origin - - tags permet de fetch les tags, elle doit être précisée y compris si un tag est fetched par référence - depth=1 permet de considérer uniquement le dernier commit - prune permet de supprimer du dossier remote en local les références qui ne sont plus accessibles - prune-tags permet non seulement de supprimer du dossier remote en local les références qui ne sont plus accessibles, mais aussi de supprimer les les tags locaux qui n'existent pas sur le remote - - git reset --hard origin/main + ATTENTION : l'ordre compte. Exécuter cette instruction en premier la rendrait inefficace en raison de l'option --recurse-submodules du git reset. Celle-ci est néanmoins à conserver pour gérer le cas de délétion du submodule. git reflog expire --expire=now --all - cette ligne permet de marquer tous les reflogs isolés comme expirés immédiatement au lieu de 90 jours plus tard. Cela permet un plus grand nettoyage par git gc. git rev-list permet de vérifier quels objets sont reliés et ne seront pas marqués comme expirés. + cette commande permet de marquer tous les reflogs isolés comme expirés immédiatement au lieu de 90 jours plus tard. Cela permet un plus grand nettoyage par git gc. git rev-list permet de vérifier quels objets sont reliés et ne seront pas marqués comme expirés. git gc --aggressive --prune=now @@ -76,13 +77,13 @@ Un clone superficiel consiste à ne pas cloner tout l'historique du dépôt. Un clone partiel consiste à ne pas cloner tous les fichiers et/ou dossiers du dépôt, selon un filtre. Les filtres peuvent concerner les Binary Large Objects (blobs) ou bien les trees. Si le filtre concerne l'ancienneté, un clone partiel peut alors aussi être un clone superficiel. Les clones partiels peuvent être créés grâce à la commande git clone --filter. Lors de check-out ou switch, des objets initialement ignorés par le clone --filter peuvent être importés. -Dans notre cas, nous ne souhaitons garder que le tout dernier commit, qui sera dans tous les cas laissé passer par git clone --filter et ce n'est donc pas pertinent. +Dans notre cas, nous ne souhaitons garder qu’un commit précis, qui sera dans tous les cas laissé passer par git clone --filter et ce n'est donc pas pertinent. Les clones partiels peuvent aussi être créés par le sparse-checking. Certains fichiers et/ou dossiers n'apparaissent alors pas du tout dans le dossier local et ne sont pas concernés par les opérations git porcelain (de surface). Néanmoins, les objets associés à ces fichiers et dossiers sont toujours stockés dans le .git -Un clone superficiel peut être grâce à l'option depth= qui indique le nombre de commits à conserver. Cette option est disponible pour la commande clone mais aussi fetch. +Un clone superficiel peut être créé grâce à l'option depth= qui indique le nombre de commits à conserver. Cette option est disponible pour la commande clone mais aussi fetch. ## Le large file storage -LFS est une extension Git qui permet de manipuler les fichiers choisis (par nom, expression ou taille) à l'aide d'un cache local. En effet, les fichiers sont remplacés par des références dans le dépôt GIt et un dossier local hors du dépôt est créé pour stocker les fichiers. Ils y sont téléchargés de manière lazy, c'est-à-dire uniquement lorsqu'ils sont checked out. Toutes les anciennes versions sont stockées sur un serveur en ligne. +LFS est une extension Git qui permet de manipuler les fichiers choisis (par nom, expression ou taille) à l'aide d'un cache local. En pratique, les fichiers sont remplacés par des références dans le dépôt Git et un dossier local hors du dépôt est créé pour stocker les fichiers. Ils y sont téléchargés de manière lazy, c'est-à-dire uniquement lorsqu'ils sont checked out. Toutes les anciennes versions sont stockées sur un serveur en ligne. C'est un mécanisme très intéressant, que nous ne retenons pas pour la même raison que le clone --filter : nous ne souhaitons garder que la toute dernière version des fichiers, qui serait dans tous les cas téléchargée par LFS. ## Suppression de l'historique @@ -93,14 +94,14 @@ La librairie Java repo-cleaner fonctionne, néanmoins la documentation Git estim Nous souhaitons supprimer tout l'historique sans filtrer, donc la commande git fetch --depth=1 suivie d'un git checkout, reset ou merge nous convient. ## checkout ? merge ? reset ? -Une fois que l'on a fetched les modifications dans notre dossier local remote/, quelle est la meilleure façon de les appliquer à notre index et working directory ? +Une fois que nous avons fetched les modifications dans notre dossier local remote/, quelle est la meilleure façon de les appliquer à notre index et working directory ? Nous allons comparer 4 possibilités : git merge -X, git merge -s, git reset --hard, git checkout -f -B. Les résultats finaux sont identiques à l'exception de git merge -X. -Dans le cas de git merge, on ne souhaite pas résoudre de conflits manuellement. Le remote doit toujours prévaloir sur les différences locales. +Dans le cas de git merge, nous ne souhaitons pas résoudre de conflits manuellement. Le remote doit toujours prévaloir sur les différences locales. ### git merge -X theirs Cette commande applique une stratégie ort qui en cas de conflit, donne la prévalence à theirs. -Néanmoins, puisque l'on travaille en --depth=1, les deux branches n'ont pas d'ancêtre commun, et on doit d'ailleurs fournir l'option --allow-unrelated-histories. L'absence d'ancêtre commun empêche Git de reconnaître les similitudes à l'intérieur d'un même fichier. N'importe quelle modification d'un fichier tracé sur ours, même sur une nouvelle ligne, causera ainsi un conflit et sera écrasée. Cette commande permet tout de même de sauvegarder les fichiers nouvellement créés et committés sur ours. +Néanmoins, puisque nous travaillons en --depth=1, les deux branches n'ont pas d'ancêtre commun, et nous devons d'ailleurs fournir l'option --allow-unrelated-histories. L'absence d'ancêtre commun empêche Git de reconnaître les similitudes à l'intérieur d'un même fichier. N'importe quelle modification d'un fichier tracé sur ours, même sur une nouvelle ligne, causera ainsi un conflit et sera écrasée. Cette commande permet tout de même de sauvegarder les fichiers nouvellement créés et committés sur ours. Les fichiers non-committés nouvellement créés sont conservés à moins que git clean soit run. Avantage : fichier commités créés sur ours conservés Inconvénient : en cas de délétion d'un fichier sur theirs qui existait déjà sur ours : il ne sera pas supprimé sur ours. @@ -108,9 +109,9 @@ Inconvénient : en cas de délétion d'un fichier sur theirs qui existait déjà ### git merge -s ours [attention les notions de theirs et ours sont inversées ici car git merge -s theirs n'existe pas] Cette commande applique une stratégie ours qui donne la prévalence à ours, qu'il y ait conflit ou pas. Elle va ignorer tous les changements et créations de fichiers committés sur theirs. Elle va également ignorer les modifications non committées. Les créations de fichier non-committées sont conservées à moins que git clean soit run. C'est le même résultat qu'avec la commande git reset --hard. -Comme l'option git merge -s theirs n'existe pas, on doit faire une petite manipulation : +Comme l'option git merge -s theirs n'existe pas, nous devons faire une petite manipulation : #on veut merge origin/main sur main, en donnant la prévalence à origin/main -#création d'une nouvelle branche temporaire temp que l'on check out, sourcée sur origin/main +#création d'une nouvelle branche temporaire temp qui est checked out, sourcée sur origin/main git switch -c temp origin/main #merge de main sur temp, en donnant la prévalence à temp qui est identique à origin/main git merge -s ours --allow-unrelated-histories main @@ -123,9 +124,8 @@ git branch -D temp Avantage : Inconvénient : création d'une branche temporaire. -### git checkout –force -B main origin/main - -Cette commande est équivalente à git merge -s ours et à git reset --hard, à la différence près que l'on finit en detached HEAD state, ce qui n'est pas un problème dans notre cas puisque l'on ne souhaite pas push de modification depuis notre dépôt. +### git checkout –force -B main origin/main +Cette commande est équivalente à git merge -s ours et à git reset --hard, à la différence près que nous finissons en detached HEAD state, ce qui n'est pas un problème dans notre cas puisque nous ne souhaitons pas push de modification depuis notre dépôt. Avantage : Inconvénient : detached HEAD state. @@ -138,9 +138,10 @@ Les tests nous montrent que les options les plus économes en mémoire sont git ### Gestion des submodules Les submodules sont clonés au début via les options de git clone --recurse-submodules --remote-submodules. -Puis ils sont mis à jour par git submodule update --init --recursive --force --depth=1 --remote. +Puis ils sont mis à jour par git submodule update --init --recursive --force --depth=1 –remote. +Git reset --hard doit avoi rl’option --recurse-submodules pour pouvoir supprimer des submodules du working directory. Les mêmes règles s'appliquent aux submodules qu'au reste du dépôt. Il est possible de préciser dans le fichier .gitmodules des règles d'import des submodules, comme un certain tag ou une certaine branche par exemple. -En retirant --remote-submodules du git clone et --remote du git submodule update, alors les submodules seront identiques au dépôt que l'on clone et plus au dépôt originel du submodule. +En retirant --remote-submodules du git clone et --remote du git submodule update, alors les submodules seront identiques au dépôt que nous clonons et plus au dépôt originel du submodule. ##Tests @@ -274,4 +275,3 @@ TEST 29: after addition then removal of a 1M file memory usage: 8 - diff --git a/doc/development_explanations.md b/doc/development_explanations.md new file mode 100644 index 0000000..5ffeeec --- /dev/null +++ b/doc/development_explanations.md @@ -0,0 +1,270 @@ +How to minimize the memory and data flow consumption of Git cloning? + +# Background + + Jean-Cloud is a small association providing hosting services on second-hand hardware. It is currently launching the Shlagernetes project, a software that enables services to be distributed and managed across several second-hand servers. Git is used in certain cases to install a service on a server or update it. + + +# Objective + + The objective is to obtain the latest version (or a specific version) of a git repository, using as few resources as possible. By resources, we mean the data flow from the remote to the local folder, as well as the memory space occupied by the repository on the local server. + + The created Git repository will not send any data to the remote. It has access to tags but not history. It can keep some local untracked files in addition to its Git clones. It includes submodules if present. It can either download the last main commit (default) or a commit from a certain reference, i.e. branch or tag. + +# Procedure + + Tests on various commands were carried out on a dummy repository. The test file is transportable and can be downloaded here. Note that to run locally, you need to authorize the protocol for local files: git config --global protocol.file.allow always. This is not the default configuration, as it may represent a security vulnerability. + + The tests consist in analyzing the memory space taken up by the local repository using the bash command "du", as well as analyzing the text produced by Git during cloning. + + +# Final results +The final chosen combination is : +## To clone : +git clone --depth=1 --recurse-submodules --remote-submodules + + depth=1 allows you to clone only the last commit along with the necessary objects. By default, it is single-branch. + recurse-submodules ensures that the contents of submodules are cloned + remote-submodules ensures submodule content is cloned from the original remote submodule + shallow-submodules ensures that only the latest submodule commit is imported (for this to work locally, specify ://file/ before the submodule path) + + +## To update : +git fetch --tags --depth=1 --prune --prune-tags origin $ref +git reset --hard --recurse-submodules FETCH_HEAD +git submodule update --init --recursive --force --depth=1 --remote +git reflog expire --expire=now --all +git gc --aggressive --prune=now +[git clean -qfdx] + + git fetch --tags --depth=1 --prune --prune-tags origin + + tags is used to fetch tags, and must be specified even if a tag is fetched by reference + depth=1 allows only the last commit to be considered + prune deletes references that are no longer accessible from the local remote folder + prune-tags not only deletes references in the local remote repository that are no longer accessible, but also deletes local tags that do not exist on the remote. + + git reset --hard --recurse-submodules origin/main + + git submodule update --init --recursive --force --depth=1 --remote + + init updates the .gitmodules file + recursive applies the command to submodules of submodules etc. + force ignores local changes to submodules and automatically checks out the new version + depth=1 allows you to consider only the last submodule commit + remote updates from the original remote submodule + CAREFUL: order does matter here. Using this instruction first would make it ineffective because of the --recurse-submodules of the git reset. This option is yet kept to deal with the case of deletion of a submodule. + + git reflog expire --expire=now --all + + this command marks all isolated reflogs as expired immediately instead of 90 days later. This makes for a bigger git gc clean up. git rev-list allows you to check which objects are linked and will not be marked as expired. + + git gc --aggressive --prune=now + + this command removes unrelated references and reorganizes the repository to optimize it. + aggressive invokes repack and takes longer. repack undoes and redoes packs, which are compression units. + + [git clean -qfdx] if this command is omitted, files created without committing are retained. + +This combination does not save any changes made to our repository, apart from the creation of non-committed files if git clean is omitted. + +# Details +Here is a summary of the different solutions we have explored to reduce the footprint of our Git repository. +## Partial vs. shallow cloning +Shallow cloning means not cloning the entire repository history. + +A partial clone means not cloning all the files and/or folders in the repository, according to a filter. Filters may concern Binary Large Objects (blobs) or trees. If the filter concerns age, then a partial clone can also be a shallow clone. +Partial clones can be created using the git clone --filter command. +During check-out or switch operations, objects initially ignored by the --filter clone can be imported. In our case, we only want to keep one precise commit, which will in any case be let through by git clone --filter which is therefore irrelevant. +Partial clones can also be created by sparse-checking. Some files and/or folders then do not appear at all in the local folder and are not affected by git porcelain (surface) operations. Nevertheless, the objects associated with these files and folders are still stored in the .git repository. + +A surface clone can be created using the depth= option, which specifies the number of commits to be kept. This option is available for both the clone and fetch commands. + +## Large file storage +LFS is a Git extension that lets you manipulate selected files (by name, expression or size) using a local cache. In practice, files are replaced by references in the Git repository and a local folder outside the repository is created to store the files. They are downloaded lazily, i.e. only when checked out. All older versions are stored on an online server. +This is a very interesting mechanism, which we will not use for the same reason as the --filter clone: we only want to keep one specific version of the files, which would in any case be downloaded by LFS. + +## Delete history +The git filter-branch command is not recommended by the Git documentation. It has several security and performance flaws. It can be used to rewrite branch history using filters. + +The Java repo-cleaner library works, but the Git documentation considers the Python filter-repo library to be faster and more secure. We do not wish to install either Python or Java, hence we will not dig any deeper into these two possibilities here. + +We want to delete the entire history without filtering, so the git command fetch --depth=1 followed by a git checkout, reset or merge works for us. + +## checkout ? merge ? reset ? +Once we have fetched the changes to our local remote/ folder, what is the best way to apply them to our index and working directory? +Let us compare 4 possibilities: git merge -X, git merge -s, git reset --hard, git checkout -f -B. The final results are identical, except for git merge -X. + +In the case of git merge, we do not wish to resolve conflicts manually. Remote must always take precedence over local differences. + +### git merge -X theirs +This command applies an ort strategy which, in the event of a conflict, gives precedence to theirs. +However, since we are working in --depth=1, the two branches have no common ancestor, and the --allow-unrelated-histories option must be supplied. The absence of a common ancestor prevents Git from recognizing similarities within the same file. Any modification to a tracked file on ours, even on a new line, will thus cause a conflict and be overwritten. This command does, however, save newly created and committed files on ours. +Newly created uncommitted files are kept unless git clean is run. +Advantage: committed files created on ours are saved. +Disadvantage: in the event of deletion of a file on theirs that already existed on ours: it will not be deleted on ours. + +### git merge -s ours +[caution: the notions of theirs and ours are reversed here, as git merge -s theirs does not exist]. +This command applies a ours strategy that gives prevalence to ours, whether there is a conflict or not. It will ignore all changes and file creations committed to theirs. It will also ignore uncommitted modifications. Uncommitted file creations are retained unless git clean is run. This is the same result as with the git reset --hard command. +As the git merge -s theirs option does not exist, we need to do a little manipulation: +#we want to merge origin/main on main, giving prevalence to origin/main +#create a new temp temporary branch that we check out, sourced on origin/main +git switch -c temp origin/main +#merge main on temp, giving prevalence to temp which is identical to origin/main +git merge -s ours --allow-unrelated-histories main +#return to main +git checkout main +#merge temp on main +git merge --allow-unrelated-histories temp +#delete temp +git branch -D temp +Advantage: +Disadvantage: creation of a temporary branch. + +### git checkout -force -B main origin/main +This command is equivalent to git merge -s ours and git reset --hard, with the difference that you end up in detached HEAD state, which does nos cause any problem in our case since we do not want to push any changes from our repository. +Advantage : +Disadvantage: detached HEAD state. + +### git reset --hard +git reset --hard is equivalent to git merge -s ours and git checkout --force -B. +Advantage: +Disadvantage: + +Tests show that the most memory-efficient options are git checkout -force -B, git merge -s ours and git --reset hard, which all do the same thing. However, git reset --hard does not involve the creation of a temporary branch and does not end in detached HEAD state, hence it is the one we choose. + +### Submodule management +Submodules are initially cloned using git clone --recurse-submodules --remote-submodules. +They are updated using git submodule update --init --recursive --force --depth=1 –remote. +Git reset --hard must be supplied with the --recurse-submodules option in order to delete submodules from the working directory. +The same rules apply to submodules as to the rest of the repository. In the .gitmodules file, it is possible to specify rules for importing submodules, such as a certain tag or branch. By removing --remote-submodules from git clone and --remote from git submodule update, submodules will be identical to the repository being cloned and no longer to the original submodule repository. + +##Tests +### Script description +The script consists of twenty-nine tests (listed in the results below), based on three functions: generate_random_file, get_storage_used and get_bandwidth. + +generate_random_file uses the bash command dd and /dev/random. +get_storage_used uses the bash command du. +get_bandwidth retrieves the output of Git commands and extracts the traffic displayed. This does not take submodule traffic into account. + +The first five tests concern cloning. +The following tests involve updating the repository using different commands, with three cases for each command: after adding a file, after deleting a file, after adding then deleting a file. + +### README extract + +NAME performance_tests.sh +SYNOPSIS performance_tests.sh [-a] [-h] [-n number]OPTIONS + -a excutes all the tests. + -n number executes test number -h prints the help. + +### Results + ======================================= Tests on the initial populating of the repository +============================================================= TEST0 +TEST 0: classic cloning. +memory usage: 22668 +bandwidth usage (submodule excluded): 8.49 MiB +============================================================= TEST1 +TEST 1: --single-branch cloning. +memory usage: 22168 +bandwidth usage (submodule excluded): 8.00 MiB +============================================================= TEST2 +TEST 2: --depth=1 --no-single-branch +memory usage: 17552 +bandwidth usage (submodule excluded): 3.49 MiB +============================================================= TEST3 +TEST 3: --depth=1 with single-branch (default)) +memory usage: 17052 +bandwidth usage (submodule excluded): 3.00 MiB +============================================================= TEST4 +TEST 4: --depth=1 with single-branch (default) and reflog and gc +HEAD is now at 23700cf adding submodule_for_performance_testing module +memory usage: 17056 +bandwidth usage (submodule excluded): 3.00 MiB +============================================================= TEST5 +TEST 5 : sparse-checking only sample0 with depth=1 +memory usage: 10060 +bandwidth usage (submodule excluded): unknown +============================================ Tests on the updating of the repository +================================================= classic fetching+checking out +============================================================= TEST6 +TEST 6: after addition of a 1M file +memory usage: +2108 +============================================================= TEST7 +TEST 7: after removal of a 1M file +memory usage: -972 +============================================================= TEST8 +TEST 8: after addition then removal of a 1M file +memory usage: 1088 +============================================== fetching+checking out with --depth=1 +============================================================= TEST9 +TEST 9: after addition of a 1M file +memory usage: +2112 +============================================================= TEST10 +TEST 10: after removal of a 1M file +memory usage: -968 +============================================================= TEST11 +TEST 11: after addition then removal of a 1M file +memory usage: 48 +========================================= --depth=1 fetching+checking out reflog and gc +============================================================= TEST12 +TEST 12: after addition of a 1M file +memory usage: +2052 +============================================================= TEST13 +TEST 13: after removal of a 1M file +memory usage: -1020 +============================================================= TEST14 +TEST 14: after addition then removal of a 1M file +memory usage: 4 +================================================ --depth=1 fetching+ reset --hard +============================================================= TEST15 +TEST 15: after addition of a 1M file +memory usage: +2116 +============================================================= TEST16 +TEST 16: after removal of a 1M file +memory usage: -964 +============================================================= TEST17 +TEST 17: after addition then removal of a 1M file +memory usage: 52 +======================================= --depth=1 fetching+ reset --hard and reflog and gc +============================================================= TEST18 +TEST 18: after addition of a 1M file +memory usage: 2056 +============================================================= TEST19 +TEST 19: after removal of a 1M file +memory usage: -1016 +============================================================= TEST20 +TEST 20: after addition then removal of a 1M file +memory usage: 8 +============================ --depth=1 fetching+checking out after modification applied in submodule +============================================================= TEST21 +TEST 21: after addition of a 1M file +memory usage: 2112 +============================================================= TEST22 +TEST 22: after removal of a 1M file +memory usage: -976 +============================================================= TEST23 +TEST 23: after addition then removal of a 1M file +memory usage: 48 +==================================== --depth=1 fetching+merging -X theirs with reflog and gc +============================================================= TEST24 +TEST 24: after addition of a 1M file +memory usage: +2056 +============================================================= TEST25 +TEST 25: after removal of a 1M file +memory usage: 8 +============================================================= TEST26 +TEST 26: after addition then removal of a 1M file +memory usage: 8 +===================================== --depth=1 fetching+merging -s ours with reflog and gc +============================================================= TEST27 +TEST 27: after addition of a 1M file +memory usage: +2056 +============================================================= TEST28 +TEST 28: after removal of a 1M file +memory usage: -1016 +============================================================= TEST29 +TEST 29: after addition then removal of a 1M file +memory usage: 8 + + diff --git a/explications_developpement.odt b/explications_developpement.odt deleted file mode 100644 index 47360c616be901f262066f32644e5cb277d78ae4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41619 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 VrV1MR?_q=w59C4VP-OjX{U0>llcE3s diff --git a/git_update.sh b/git_update.sh deleted file mode 100755 index 2056059..0000000 --- a/git_update.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/bash -Help(){ - echo " -NAME - git_update.sh -SYNOPSIS - git_update.sh [-h] [-r ref] [-d dest] [-H] [-a] repository -OPTIONS - -h prints the help. - -r specifies the reference to the commit to be synchronized. It can be a tag or a branch. By default, it is the last commit of branch main. - -d specifies the destination of the clone or update. Directory must be empty if a new clone is to be made. - If the repository to be cloned is local, and its path is passed as a relative path, the path should start from the destination. - To avoid mistakes, absolute paths are advised. - -H allows the $HOME directory to be used by git_update.sh. By default, git_update.sh cannot access $HOME to prevent default behavior. - If you need the global .gitconfig located in your $HOME to be used, you should supply the -H option. - -a specifies that the aggressive option of the git garbage collection must be used. Only advised when changes happen in many different objects. Will slow down the execution. -DESCRIPTION - This script will replace the destination with the wanted commit of a git repository. The history is not preserved but tags are. Untracked files remain. - The git commands have been chosen so as to minimize the memory and bandwidth usages." -} - -#variables -summary="$0 [options] " -ref=main -dst='.' -use_home=false -be_aggressive="false" - -while getopts ":hr:d:H" option; do - case $option in - h) # display Help - Help - exit;; - r) # desired branch or tag - ref="$OPTARG";; - d) # destination of clone - dst="$OPTARG";; - H) # use real home dir - use_home="true";; - a) #use -a in git gc call - be_aggressive="true";; - \?) # invalid option - echo "Error: Invalid option here" - exit;; - esac -done -shift $((OPTIND-1)) - -repo="$1" -if [ -z "$repo" ] ; then - exit "$0: Empty repo given\n$summary" -fi - -if [ ! $use_home ] ; then - set -a - export HOME=/dev/null - set +a -fi - -mkdir -p "$dst" -cd "$dst" - -if [ -d .git ] ; then - echo "updating..." - git fetch --tags --depth=1 --prune --prune-tags --force origin $ref - git reset --hard --recurse-submodules FETCH_HEAD - git submodule update --init --recursive --force --depth=1 --remote - #garbage collection of anything unreachable at the moment - git reflog expire --expire=now --all - if "$be_aggressive" ; then - git gc --prune=now --aggressive - elsels - git gc --prune=now - fi -else -echo "cloning..." - clone_dst='.' - git clone -b "$ref" --recurse-submodules --shallow-submodules --depth 1 "$repo" "$clone_dst" -fi - diff --git a/notes.odt b/notes.odt deleted file mode 100644 index d2f8ff3e9a8e00e06fbc712a0df4e225d464197b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98198 zcmb4q1yE(Z(je{(4i|TKcLsNNhl|VLZiBnKySux)ySw`^zyN~{+@0_L>uv3By?tAo zQ>n^1)s{}@q&uA`%Rxe6f`P$-f!R1-X&a8QAyI>Yf&Ekeegd0*fYD^n=v^6U94T0930K<%^XbK?9A<5nOx01U6ubgVt?`fXTkg15_7P(u(ot_ z{x32vY|O3>4&NMs_U7N1|L=H!e}ngzotp{J`TrBk;+q4|)%-tU{W}>Q9UR>p|6%wa zxDost86BM+ES=3=T>i71|Bj=JE6~;L|AF`KwDONO|1&q@e

09njL;g;~_v)eh+B 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żcJgSi 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 MVbvP^P&0}4KUfU}ga7~l diff --git a/performance_tests.sh b/performance_tests.sh deleted file mode 100755 index c3d093d..0000000 --- a/performance_tests.sh +++ /dev/null @@ -1,1041 +0,0 @@ -#!/bin/bash -. driglibash-base - -REPO_NAME=git_update_testing -REPO_PATH=./remote -WITH_SUBMODULE="true" -SUB_NAME="submodule_for_performance_testing" -FILES_TO_KEEP='sample0' -REMOTE="./remote/performance_testing" - -if [ "$WITH_SUBMODULE" = "true" ]; then - bash creation_repo.sh -s &> /dev/null -else - bash creation_repo.sh &> /dev/null -fi - -Help() -{ - echo " -NAME - performance_tests.sh -SYNOPSIS - performance_tests.sh [-a] [-h] [-n number] -OPTIONS - -a excutes all the tests. - -n number executes test number - -h prints the help. -DESCRIPTION - This script is in writing. It allows you to measure memory and bandwidth usage. The first four test different cloning methods. Te following apply changes to the local remote before testing fetching and merging commands. - TEST0: classic cloning - TEST1: --single-branch cloning - TEST2: --depth=1 --no-single-branch cloning - TEST3: --depth=1 cloning - TEST4: --depth=1 with reflog and gc cloning - TEST5: sparse-checking 1M sample0 cloning - _________________ - TEST6: classic fetching+checking out after addition of a 1M file - TEST7: classic fetching+checking out after removal of a 1M file - TEST8: classic fetching+checking out after addition then removal of a 1M file - - TEST9: --depth=1 fetching+checking out after addition of a 1M file - TEST10: --depth=1 fetching+checking out after removal of a 1M file - TEST11: --depth=1 fetching+checking out after addition then removal of 1M a file - - TEST12: --depth=1 fetching+checking out with reflog annd gc after addition of a 1M file - TEST13: --depth=1 fetching+checking out with reflog annd gc after removal of a 1M file - TEST14: --depth=1 fetching+checking out with reflog annd gc after addition then removal of a 1M file - - TEST15: --depth=1 fetching+ --reset=hard after addition of a 1M file - TEST16: --depth=1 fetching+ --reset=hard after removal of a 1M file - TEST17: --depth=1 fetching+ --reset=hard after addition then removal of a 1M file - - TEST18: --depth=1 fetching+ --reset=hard and reflog and gc after addition of a 1M file - TEST19: --depth=1 fetching+ --reset=hard and reflog and gc after removal of a 1M file - TEST20: --depth=1 fetching+ --reset=hard and reflog and gc after addition then removal of a 1M file - - TEST21: --depth=1 fetching+checking out after addition of a 1M file in submodule - TEST22: --depth=1 fetching+checking out after removal of a 1M file in submodule - TEST23: --depth=1 fetching+checking out after addition then removal of a 1M file in submodule - - TEST24: --depth=1 fetching+merging -X theirs with reflog and gc after addition of a 1M file - TEST25: --depth=1 fetching+merging -X theirs with reflog and gc after removal of a 1M file - TEST26: --depth=1 fetching+merging -X theirs with reflog and gc after addition then removal of a 1M file - - TEST27: --depth=1 fetching+merging -s ours with reflog and gc after addition of a 1M file - TEST28: --depth=1 fetching+merging -s ours with reflog and gc after removal of a 1M file - TEST29: --depth=1 fetching+merging -s ours with reflog and gc after addition then removal of a 1M file" -} - -#USEFUL FUNCTIONS FOR THE TESTS -create_random_file(){ - run dd if=/dev/urandom of=$1 bs=$2 count=1 &> /dev/null -} - -get_storage_used(){ - mem=$(du $1 | tail -n1 | tr -cd [:digit:]) -} - -get_bandwidth(){ - bw="unknown" - bw=$(grep -e "Receiving objects:" $1 | grep -o "Receiving objects: [[:alnum:]%/(),. ]*" | tail -n1) - bw=${bw#*,} -} - -#TESTS ON THE INITIAL POPULATING OF THE REPO -section "Tests on the initial populating of the repository" -test0(){ - section TEST0 - echo "TEST 0: classic cloning." - run git clone --recurse-submodules --remote-submodules --progress --no-local $1 &> cloning_text - run cd $REPO_NAME - run git submodule update --init --recursive --force --remote --progress &> /dev/null - run cd .. - get_storage_used "./$REPO_NAME" - get_bandwidth cloning_text - echo "memory usage: $mem" - echo "bandwidth usage (submodule excluded): $bw" - run rm cloning_text - run rm -rf $REPO_NAME -} - -test1(){ - section TEST1 - echo "TEST 1: --single-branch cloning." - run git clone --recurse-submodules --remote-submodules --progress --single-branch --no-local $1 &> cloning_text - run cd $REPO_NAME - run git submodule update --init --recursive --force --remote --progress &> /dev/null - run cd .. - get_storage_used ./$REPO_NAME - get_bandwidth cloning_text - echo "memory usage: $mem" - echo "bandwidth usage (submodule excluded): $bw" - run rm cloning_text - run rm -rf $REPO_NAME -} - -test2(){ - section TEST2 - echo "TEST 2: --depth=1 --no-single-branch" - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local --no-single-branch $1 &> cloning_text - run cd $REPO_NAME - run git submodule update --init --recursive --force --remote --progress --depth=1 --no-single-branch &> /dev/null - run cd .. - get_storage_used ./$REPO_NAME - get_bandwidth cloning_text - echo "memory usage: $mem" - echo "bandwidth usage (submodule excluded): $bw" - run rm cloning_text - run rm -rf $REPO_NAME -} - -test3(){ - section TEST3 - echo "TEST 3: --depth=1 with single-branch (default))" - run git clone --recurse-submodules --remote-submodules --progress --single-branch --no-local --depth=1 $1 &> cloning_text - run cd $REPO_NAME - run git submodule update --init --recursive --force --remote --progress --depth=1 &> /dev/null - run cd .. - get_storage_used ./$REPO_NAME - get_bandwidth cloning_text - echo "memory usage: $mem" - echo "bandwidth usage (submodule excluded): $bw" - run rm cloning_text - run rm -rf $REPO_NAME -} - -test4(){ - section TEST4 - echo "TEST 4: --depth=1 with single-branch (default) and reflog and gc" - run git clone --recurse-submodules --remote-submodules --progress --single-branch --no-local --depth=1 $1 &> cloning_text - run cd $REPO_NAME - run git submodule update --init --recursive --force --remote --progress --depth=1 &> /dev/null - run git reset --hard - run cd .. - get_storage_used ./$REPO_NAME - get_bandwidth cloning_text - echo "memory usage: $mem" - echo "bandwidth usage (submodule excluded): $bw" - run rm cloning_text - run rm -rf $REPO_NAME -} - -test5(){ - section TEST5 - run mkdir $REPO_NAME - run echo "TEST 5 : sparse-checking only $FILES_TO_KEEP with depth=1" - #creating a git repo with sparse-checking settings - run cd $REPO_NAME - run git init -q - run git config core.sparsecheckout true - run echo $FILES_TO_KEEP >> .git/info/sparse-checkout - #pulling from the remote with sparse-checking enabled - run git remote add -f origin ../$1 &> /dev/null - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git checkout -f origin/main &> /dev/null - get_storage_used . - echo "memory usage: $mem" - echo "bandwidth usage (submodule excluded): unknown" - run cd .. - run rm -rf $REPO_NAME -} - -#Tests on the updating of the repository -#classic fetching -test6(){ - section TEST6 - run echo 'TEST 6: after addition of a 1M file' - #initialization - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - create_random_file 'sample5' '1M' #adding a 1M file - run git add sample5 - run git commit --quiet -m"fourth 1M sample created" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --remote &> /dev/null - run git fetch --progress --tags --prune --prune-tags origin &> /dev/null - run git checkout -f origin/main &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: +$mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing -} -test7(){ - section TEST7 - run echo 'TEST 7: after removal of a 1M file' - #initialization - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - run rm sample0 - run git add sample0 - run git commit --quiet -m"1M sample0 deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --remote &> /dev/null - run git fetch --progress --tags --prune --prune-tags origin &> /dev/null - run git checkout -f origin/main &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~1 - run git clean -df - run cd ../.. - run rm -rf performance_testing -} -test8(){ - section TEST8 - run echo 'TEST 8: after addition then removal of a 1M file' - #initialization - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - create_random_file 'sample5' '1M' #adding a 1M file - run git add sample5 - run git commit --quiet -m"fourth 1M sample created" - run rm sample5 - run git add sample5 - run git commit --quiet -m"1M "sample5" deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --remote &> /dev/null - run git fetch --progress --tags --prune --prune-tags origin &> /dev/null - run git checkout -f origin/main &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~2 - run cd ../.. - run rm -rf performance_testing -} - -#fetching with --depth=1 -test9(){ - section TEST9 - run echo 'TEST 9: after addition of a 1M file' - #initialization - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - create_random_file 'sample5' '1M' #adding a 1M file - run git add sample5 - run git commit --quiet -m"fourth 1M sample created" - run cd ../../$REPO_NAME - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git checkout -f origin/main &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: +$mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing -} -test10(){ - section TEST10 - run echo 'TEST 10: after removal of a 1M file' - #initialization - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - run rm sample0 - run git add sample0 - run git commit --quiet -m"1M sample0 deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git checkout -f origin/main &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing -} -test11(){ - section TEST11 - run echo 'TEST 11: after addition then removal of a 1M file' - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - create_random_file 'sample5' '1M' #adding a 1M file - run git add sample5 - run git commit --quiet -m"fourth 1M sample created" - run rm sample5 - run git add sample5 - run git commit --quiet -m"1M "sample5" deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git checkout -f origin/main &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~2 - run cd ../.. - run rm -rf performance_testing -} - -# --depth=1 fetching with reflog and gc -test12(){ - section TEST12 - run echo 'TEST 12: after addition of a 1M file' - #initialization - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - create_random_file 'sample5' '1M' #adding a 1M file - run git add sample5 - run git commit --quiet -m"fourth 1M sample created" - run cd ../../$REPO_NAME - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git checkout -f origin/main &> /dev/null - run git reflog expire --expire=now --all &> /dev/null - run git gc --aggressive --prune=now &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: +$mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing -} -test13(){ - section TEST13 - run echo 'TEST 13: after removal of a 1M file' - #initialization - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - run rm sample0 - run git add sample0 - run git commit --quiet -m"1M sample0 deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git checkout -f origin/main &> /dev/null - run git reflog expire --expire=now --all &> /dev/null - run git gc --aggressive --prune=now &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing -} -test14(){ - section TEST14 - run echo 'TEST 14: after addition then removal of a 1M file' - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - create_random_file 'sample5' '1M' #adding a 1M file - run git add sample5 - run git commit --quiet -m"fourth 1M sample created" - run rm sample5 - run git add sample5 - run git commit --quiet -m"1M "sample5" deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git checkout -f origin/main &> /dev/null - run git reflog expire --expire=now --all &> /dev/null - run git gc --aggressive --prune=now &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~2 - run cd ../.. - run rm -rf performance_testing -} - -#--depth=1 fetching with reset --hard -test15(){ - section TEST15 - run echo 'TEST 15: after addition of a 1M file' - #initialization - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - create_random_file 'sample5' '1M' #adding a 1M file - run git add sample5 - run git commit --quiet -m"fourth 1M sample created" - run cd ../../$REPO_NAME - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git reset --hard origin/main &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: +$mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing -} -test16(){ - section TEST16 - run echo 'TEST 16: after removal of a 1M file' - #initialization - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - run rm sample0 - run git add sample0 - run git commit --quiet -m"1M sample0 deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git reset --hard origin/main &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing -} -test17(){ - section TEST17 - run echo 'TEST 17: after addition then removal of a 1M file' - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - create_random_file 'sample5' '1M' #adding a 1M file - run git add sample5 - run git commit --quiet -m"fourth 1M sample created" - run rm sample5 - run git add sample5 - run git commit --quiet -m"1M "sample5" deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git reset --hard origin/main &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~2 - run cd ../.. - run rm -rf performance_testing -} -#--depth=1 fetching with reset --hard and reflog and gc -test18(){ - section TEST18 - run echo 'TEST 18: after addition of a 1M file' - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - create_random_file 'sample5' '1M' #adding a 1M file - run git add sample5 - run git commit --quiet -m"fourth 1M sample created" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git reset --hard origin/main &> /dev/null - run git reflog expire --expire=now --all &> /dev/null - run git gc --aggressive --prune=now &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing -} -test19(){ - section TEST19 - run echo 'TEST 19: after removal of a 1M file' - #initialization - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - run rm sample0 - run git add sample0 - run git commit --quiet -m"1M sample0 deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git reset --hard origin/main &> /dev/null - run git reflog expire --expire=now --all &> /dev/null - run git gc --aggressive --prune=now &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing -} -test20(){ - section TEST20 - run echo 'TEST 20: after addition then removal of a 1M file' - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - create_random_file 'sample5' '1M' #adding a 1M file - run git add sample5 - run git commit --quiet -m"fourth 1M sample created" - run rm sample5 - run git add sample5 - run git commit --quiet -m"1M "sample5" deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git reset --hard origin/main &> /dev/null - run git reflog expire --expire=now --all &> /dev/null - run git gc --aggressive --prune=now &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~2 - run cd ../.. - run rm -rf performance_testing -} -#--depth=1 fetching after modification applied in submodule -test21(){ - section TEST21 - run echo 'TEST 21: after addition of a 1M file' - if [ "$WITH_SUBMODULE" = "true" ]; then - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote submodule - run cd .. - run cd $REPO_PATH/$SUB_NAME - create_random_file 'sub_sample1' '1M' - run git add sub_sample1 - run git commit --quiet -m"second 1M sample created" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git checkout -f origin/main &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REPO_PATH/$SUB_NAME - run git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing - else - echo "This test will not be performed because we are in no-submodule mode. Change boolean \$WITH_SUBMODULE to switch." - fi -} - -test22(){ - section TEST22 - run echo 'TEST 22: after removal of a 1M file' - if [ "$WITH_SUBMODULE" = "true" ]; then - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote submodule - run cd .. - run cd $REPO_PATH/$SUB_NAME - rm sub_sample0 - run git add sub_sample0 - run git commit --quiet -m"1M 'sub_sample0' deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - git checkout -f origin/main &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REPO_PATH/$SUB_NAME - run git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing - else - echo "This test will not be performed because we are in no-submodule mode. Change boolean \$WITH_SUBMODULE to switch." - fi -} - -test23(){ - section TEST23 - run echo 'TEST 23: after addition then removal of a 1M file' - if [ "$WITH_SUBMODULE" = "true" ]; then - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote submodule - run cd .. - run cd $REPO_PATH/$SUB_NAME - create_random_file 'sub_sample1' '1M' - run git add sub_sample1 - run git commit --quiet -m"second 1M sample created" - rm sub_sample1 - run git add sub_sample1 - run git commit --quiet -m"1M 'sub_sample1' deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git checkout -f origin/main &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REPO_PATH/$SUB_NAME - run git reset --hard -q HEAD~2 - run cd ../.. - run rm -rf performance_testing - else - echo "This test will not be performed because we are in no-submodule mode. Change boolean \$WITH_SUBMODULE to switch." - fi -} - -# --depth=1 fetching+merging -X theirs with reflog and gc -test24(){ - section TEST24 - run echo 'TEST 24: after addition of a 1M file' - #initialization - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - create_random_file 'sample5' '1M' #adding a 1M file - run git add sample5 - run git commit --quiet -m"fourth 1M sample created" - run cd ../../$REPO_NAME - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git merge -X theirs --allow-unrelated-histories &> /dev/null - run git reflog expire --expire=now --all &> /dev/null - run git gc --aggressive --prune=now &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: +$mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing -} -test25(){ - section TEST25 - run echo 'TEST 25: after removal of a 1M file' - #initialization - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - run rm sample0 - run git add sample0 - run git commit --quiet -m"1M sample0 deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git merge -X theirs --allow-unrelated-histories &> /dev/null - run git reflog expire --expire=now --all &> /dev/null - run git gc --aggressive --prune=now &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing -} -test26(){ - section TEST26 - run echo 'TEST 26: after addition then removal of a 1M file' - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - create_random_file 'sample5' '1M' #adding a 1M file - run git add sample5 - run git commit --quiet -m"fourth 1M sample created" - run rm sample5 - run git add sample5 - run git commit --quiet -m"1M "sample5" deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git merge -X theirs --allow-unrelated-histories &> /dev/null - run git reflog expire --expire=now --all &> /dev/null - run git gc --aggressive --prune=now &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~2 - run cd ../.. - run rm -rf performance_testing -} - -# --depth=1 fetching+merging -s ours with reflog and gc -test27(){ - section TEST27 - run echo 'TEST 27: after addition of a 1M file' - #initialization - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - create_random_file 'sample5' '1M' #adding a 1M file - run git add sample5 - run git commit --quiet -m"fourth 1M sample created" - run cd ../../$REPO_NAME - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git switch -c temp origin/main &> /dev/null #creating a temporary branch identical to origin/main - run git merge -s ours --allow-unrelated-histories main &> /dev/null - run git checkout main &> /dev/null - run git merge --allow-unrelated-histories temp &> /dev/null - run git branch -D temp &> /dev/null - run git reflog expire --expire=now --all &> /dev/null - run git gc --aggressive --prune=now &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: +$mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing -} -test28(){ - section TEST28 - run echo 'TEST 28: after removal of a 1M file' - #initialization - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - run rm sample0 - run git add sample0 - run git commit --quiet -m"1M sample0 deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git switch -c temp origin/main &> /dev/null #creating a temporary branch identical to origin/main - run git merge -s ours --allow-unrelated-histories main &> /dev/null - run git checkout main &> /dev/null - run git merge --allow-unrelated-histories temp &> /dev/null - run git branch -D temp &> /dev/null - run git reflog expire --expire=now --all &> /dev/null - run git gc --aggressive --prune=now &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~1 - run cd ../.. - run rm -rf performance_testing -} -test29(){ - section TEST29 - run echo 'TEST 29: after addition then removal of a 1M file' - run git clone --recurse-submodules --remote-submodules --progress --depth=1 --no-local $1 &> /dev/null - run cd $REPO_NAME - get_storage_used . - mem_before=$mem - #modification of the remote repo - run cd ../$REMOTE - create_random_file 'sample5' '1M' #adding a 1M file - run git add sample5 - run git commit --quiet -m"fourth 1M sample created" - run rm sample5 - run git add sample5 - run git commit --quiet -m"1M "sample5" deleted" - run cd ../../$REPO_NAME - #fetching - run git submodule update --init --recursive --force --depth=1 --remote &> /dev/null - run git fetch --progress --tags --depth=1 --prune --prune-tags origin &> /dev/null - run git switch -c temp origin/main &> /dev/null #creating a temporary branch identical to origin/main - run git merge -s ours --allow-unrelated-histories main &> /dev/null - run git checkout main &> /dev/null - #run git merge --allow-unrelated-histories temp &> /dev/null - run git branch -D temp &> /dev/null - run git reflog expire --expire=now --all &> /dev/null - run git gc --aggressive --prune=now &> /dev/null - get_storage_used . - mem_after=$mem - mem=$(($mem_after-$mem_before)) - echo "memory usage: $mem" - run cd ../$REMOTE - run git reset --hard -q HEAD~2 - run cd ../.. - run rm -rf performance_testing -} - - -while getopts ":hn:a" option; do - case $option in - h) # display Help - Help - exit;; - n) - TEST_NUM=$OPTARG;; - a) - ALL_TESTS=true;; - \?) # Invalid option - echo "Error: Invalid option here" - exit;; - esac -done - -if [ "$ALL_TESTS" = "true" ]; then - test0 $REMOTE - test1 $REMOTE - test2 $REMOTE - test3 $REMOTE - test4 $REMOTE - test5 $REMOTE - echo $(section "Tests on the updating of the repository") - section "classic fetching+checking out" - test6 $REMOTE - test7 $REMOTE - test8 $REMOTE - echo $(section "fetching+checking out with --depth=1") - test9 $REMOTE - test10 $REMOTE - test11 $REMOTE - echo $(section "--depth=1 fetching+checking out reflog and gc") - test12 $REMOTE - test13 $REMOTE - test14 $REMOTE - echo $(section "--depth=1 fetching+ reset --hard") - test15 $REMOTE - test16 $REMOTE - test17 $REMOTE - echo $(section "--depth=1 fetching+ reset --hard and reflog and gc") - test18 $REMOTE - test19 $REMOTE - test20 $REMOTE - echo $(section "--depth=1 fetching+checking out after modification applied in submodule") - test21 $REMOTE - test22 $REMOTE - test23 $REMOTE - echo $(section "--depth=1 fetching+merging -X theirs with reflog and gc") - test24 $REMOTE - test25 $REMOTE - test26 $REMOTE - echo $(section "--depth=1 fetching+merging -s ours with reflog and gc") - test27 $REMOTE - test28 $REMOTE - test29 $REMOTE - - -elif [ -n "$TEST_NUM" ]; then - case $TEST_NUM in - 0) - test0 $REMOTE;; - 1) - test1 $REMOTE;; - 2) - test2 $REMOTE;; - 3) - test3 $REMOTE;; - 4) - test4 $REMOTE;; - 5) - test5 $REMOTE;; - 6) - test6 $REMOTE;; - 7) - test7 $REMOTE;; - 8) - test8 $REMOTE;; - 9) - test9 $REMOTE;; - 10) - test10 $REMOTE;; - 11) - test11 $REMOTE;; - 12) - test12 $REMOTE;; - 13) - test13 $REMOTE;; - 14) - test14 $REMOTE;; - 15) - test15 $REMOTE;; - 16) - test16 $REMOTE;; - 17) - test17 $REMOTE;; - 18) - test18 $REMOTE;; - 19) - test19 $REMOTE;; - 20) - test20 $REMOTE;; - 21) - test21 $REMOTE;; - 22) - test22 $REMOTE;; - 23) - test23 $REMOTE;; - 24) - test24 $REMOTE;; - 25) - test25 $REMOTE;; - 26) - test26 $REMOTE;; - 26) - test26 $REMOTE;; - 27) - test27 $REMOTE;; - 28) - test28 $REMOTE;; - 29) - test29 $REMOTE;; - *) - echo "Error: Invalid test number" - die;; - esac -else - Help -fi - -#add the submodules management to the cloning -#add run \ No newline at end of file diff --git a/readme b/readme index ec12859..01a5144 100644 --- a/readme +++ b/readme @@ -1,13 +1,40 @@ # Overview -git_update.sh is a bash script performing a punctual synchronisation of a git repository. - +git_update.sh is a bash script performing a punctual synchronization of a git repository. +The script will replace the indicated destination with the wanted commit of a git repository. The history is not preserved but tags are. +The git commands have been chosen so as to minimize the memory and bandwidth usages." # Download Download the git_update.sh file. Git has to be installed on your computer. # Use +Extract of the help: +NAME + git_update.sh +SYNOPSIS + git_update.sh [-h] [-r ref] [-d dest] [-H] [-N] [-a] repository +OPTIONS + -h prints the help. + -r specifies the reference to the commit to be synchronized. It can be a tag or a branch. By default, it is the last commit of branch main. + -d specifies the destination of the clone or update. If it is non-empty and you want to keep the non-conflicting files, -N must be supplied. Otherwise all files will be deleted, even if gitignored. + If the repository to be cloned is local, and its path is passed as a relative path, the path should start from the destination. + To avoid mistakes, absolute paths are advised. + -H allows the $HOME directory to be used by git_update.sh. By default, git_update.sh cannot access $HOME to prevent default behavior. + If you need the global .gitconfig located in your $HOME to be used, you should supply the -H option. + -N indicates that the destination is non-empty. The files that do not conflict and, if it is an update, are not committed, will be kept. + By default, all files which are not in the imported commit are deleted, included those in the .gitignore. + -a specifies that the aggressive option of git clean must be used. git clean is called when -N is not supplied. + +# Examples +A) I want to clone the last commit of a branch into a non-existing directory +./path/to/git_update.sh -r myBranch -d myDirectory https://git.mydomain/myname/myrepository.git +Result: a directory myDirectory has been created in the current working directory. It is filled with the files of the last commit of branch myBranch as well as the .git. The history only shows the last commit, however the tags are accessible. + +B) I want to clone a certain tag into a preexisting directory. +./path/to/git_update.sh -r myTag -d myDirectory -N https://git.mydomain/myname/myrepository.git +Result: all the files of myDirectory have been kept, except those whose names were identical with files of myTag. Files of myTag have been imported + # Development process git_update.sh has been written by the French association Jean-Cloud, in the process of developing Shlagernetes, a new orchestration tool. Shlagernetes allows storing services on fallible second-hand servers and tries to consume the less possible resources. diff --git a/src/git_update.sh b/src/git_update.sh index 7781165..2056059 100755 --- a/src/git_update.sh +++ b/src/git_update.sh @@ -1,61 +1,54 @@ #!/bin/bash +Help(){ + echo " +NAME + git_update.sh +SYNOPSIS + git_update.sh [-h] [-r ref] [-d dest] [-H] [-a] repository +OPTIONS + -h prints the help. + -r specifies the reference to the commit to be synchronized. It can be a tag or a branch. By default, it is the last commit of branch main. + -d specifies the destination of the clone or update. Directory must be empty if a new clone is to be made. + If the repository to be cloned is local, and its path is passed as a relative path, the path should start from the destination. + To avoid mistakes, absolute paths are advised. + -H allows the $HOME directory to be used by git_update.sh. By default, git_update.sh cannot access $HOME to prevent default behavior. + If you need the global .gitconfig located in your $HOME to be used, you should supply the -H option. + -a specifies that the aggressive option of the git garbage collection must be used. Only advised when changes happen in many different objects. Will slow down the execution. +DESCRIPTION + This script will replace the destination with the wanted commit of a git repository. The history is not preserved but tags are. Untracked files remain. + The git commands have been chosen so as to minimize the memory and bandwidth usages." +} -# Clone un dépôt git au bon endroit -# Stocker un minum de données (et donc nettoyer) -# Télécharger un minimum de données -# En cas de conflit donner raison au remote (on écrase les versions locales) - - -declare -A usage -declare -A varia - +#variables summary="$0 [options] " - -usage[b]="Branch of git repo" -varia[b]=branch -branch=master - -usage[t]="Tog of git repo" -varia[t]=tag -tag= - -usage[d]="Destination of clone" -varia[d]=dst +ref=main dst='.' - -usage[i]="privkey used to ssh pull" -varia[i]=privkey -privkey='' - -usage[N]="Clone to a Non-empty target. Existing files will be overwriten" -varia[N]=nonempty_target -nonempty_target=false - -usage[K]="Remote host key file (known_hosts) for ssh connections" -varia[K]=hostkeyfile -hostkeyfile='' - -usage[H]="Use real home dir" -varia[H]=use_home use_home=false +be_aggressive="false" - -. driglibash-args - - -# Some SSH options -ssh_opt='ssh' -if [ -n "$privkey" ] ; then - ssh_opt="$ssh_opt -i $privkey" -fi - -if [ -n "$hostkeyfile" ] ; then - ssh_opt="$ssh_opt -o 'UserKnownHostsFile $hostkeyfile'" -fi +while getopts ":hr:d:H" option; do + case $option in + h) # display Help + Help + exit;; + r) # desired branch or tag + ref="$OPTARG";; + d) # destination of clone + dst="$OPTARG";; + H) # use real home dir + use_home="true";; + a) #use -a in git gc call + be_aggressive="true";; + \?) # invalid option + echo "Error: Invalid option here" + exit;; + esac +done +shift $((OPTIND-1)) repo="$1" if [ -z "$repo" ] ; then - die "$0: Empty repo given\n$summary" + exit "$0: Empty repo given\n$summary" fi if [ ! $use_home ] ; then @@ -64,44 +57,24 @@ if [ ! $use_home ] ; then set +a fi -run mkdir -p "$dst" -run cd "$dst" - +mkdir -p "$dst" +cd "$dst" if [ -d .git ] ; then - - # Compute git branch and tag - tagref= - if [ -n "$tag" ] ; then - tagref="tags/$tag" - fi - - run git fetch origin "$branch" --tags -f - run git checkout --force $tagref "origin/$branch" - run git reset --hard # TODO we can keep some files? - # Preserve existing files in some cases - if ! "$nonempty_target" ; then - git clean -qffdx + echo "updating..." + git fetch --tags --depth=1 --prune --prune-tags --force origin $ref + git reset --hard --recurse-submodules FETCH_HEAD + git submodule update --init --recursive --force --depth=1 --remote + #garbage collection of anything unreachable at the moment + git reflog expire --expire=now --all + if "$be_aggressive" ; then + git gc --prune=now --aggressive + elsels + git gc --prune=now fi - run git submodule update --init --recursive --force --recommend-shallow - run git submodule foreach git fetch - run git submodule foreach git checkout --force HEAD - run git submodule foreach git reset --hard - run git submodule foreach git clean -fdx else +echo "cloning..." clone_dst='.' - - # To override an existing dir, we need to clone elsewhere first - if "$nonempty_target" ; then - clone_dst="$(mktemp -d)" - fi - - run git clone -b "$branch" --single-branch --recurse-submodules --shallow-submodules --depth 1 --config core.sshCommand="$ssh_opt" "$repo" "$clone_dst" - - # To override an existing dir, we then move everything to that dir - if "$nonempty_target" ; then - run mv "$clone_dst/"{*,.*} . - run rmdir "$clone_dst" - fi + git clone -b "$ref" --recurse-submodules --shallow-submodules --depth 1 "$repo" "$clone_dst" fi diff --git a/src/pre-push b/src/pre-push deleted file mode 100755 index de70fc2..0000000 --- a/src/pre-push +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -# Get package version -# TODO Add some well-known version provider mechanisms -version="" -[ -f package.json ] && version=$(npm pkg get version | tr -d '\"') -[ -f version ] && version=$(cat version) -[ -f VERSION ] && version=$(cat VERSION) - -# Create semver tags -git tag -f v${version%.*.*} -git tag -f v${version%.*} -git tag -f v$version - -# Push the tags -git push --no-verify --tags -f diff --git a/creation_repo.sh b/test/creation_repo.sh similarity index 100% rename from creation_repo.sh rename to test/creation_repo.sh diff --git a/test_git_update.sh b/test/functional_tests/test_git_update.sh similarity index 100% rename from test_git_update.sh rename to test/functional_tests/test_git_update.sh diff --git a/readme.md b/test/performance_tests/readme similarity index 100% rename from readme.md rename to test/performance_tests/readme diff --git a/tests-manuels/pourTesterGitUpdate b/tests-manuels/pourTesterGitUpdate deleted file mode 160000 index 0767da6..0000000 --- a/tests-manuels/pourTesterGitUpdate +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0767da6236479ef7a3e43ec6d5d74f0663901205