prog:git
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| prog:git [2024/04/05 18:15] – ↷ Liens modifiés en raison d'un déplacement. 47.128.22.190 | prog:git [2025/11/24 11:32] (Version actuelle) – Ajout de "Retravailler l'historique" root | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | =====Téléchargement===== | ||
| + | ====Windows==== | ||
| + | [[https:// | ||
| + | |||
| + | [[http:// | ||
| + | |||
| =====Dépôts===== | =====Dépôts===== | ||
| - | ====Cloner et configurer d'un dépôt==== | + | |
| - | <code bash> | + | ====Configurer==== |
| - | git clone https:// | + | |
| - | </ | + | ===Options globales=== |
| - | Mais surtout, ne pas oublier (l' | + | |
| + | Ne pas oublier (l' | ||
| <code bash> | <code bash> | ||
| Ligne 56: | Ligne 63: | ||
| [[https:// | [[https:// | ||
| - | ===Ne pas télécharger l' | ||
| - | Pratique pour ne faire que de la compilation et alléger le téléchargement. | ||
| - | Ajouter '' | ||
| - | ===Télécharger uniquement une seule branche=== | + | =====Clés publiques |
| - | git clone --single-branch --branch llvmorg-8.0.0 https:// | + | |
| - | ====Un dépôt global ou un dépôt | + | Pour signer les commits, il faut commencer |
| - | C'est l' | + | |
| - | Ici, je suppose qu'il y a une équipe d'une trentaine | + | ====Génération |
| - | De par mon expérience, | + | <code bash> |
| + | gpg --full-generate-key | ||
| + | </code> | ||
| - | ^Problématique | + | Choisir |
| - | ^ ::: ^ X | + | |
| - | | Nombres de dépôts git | {{ : | + | |
| - | | Gestion des submodules | + | |
| - | | ::: | {{ : | + | |
| - | | ::: | {{ : | + | |
| - | | Travail en groupe | + | |
| - | | ::: | {{ : | + | |
| - | | ::: | {{ : | + | |
| - | Conclusion : si l' | + | ====Afficher la clé publique |
| - | ====Changer l' | ||
| - | Pour connaître l' | ||
| <code bash> | <code bash> | ||
| - | git remote | + | gpg --list-secret-keys --keyid-format LONG |
| </ | </ | ||
| - | Pour la modifier | + | Avec '' |
| + | |||
| + | Pour exporter | ||
| <code bash> | <code bash> | ||
| - | git remote set-url origin https:// | + | gpg --armor --export YYYYYYYYY |
| </ | </ | ||
| - | [[https:// | + | Pour exporter la clé privée |
| - | ====Déplacer un dossier vers au nouveau dépôt==== | + | <code bash> |
| - | <WRAP center round important 60%> | + | gpg --export-secret-keys YYYYYYYYY > file.key |
| - | Il faut créer un double du clone du dépôt car c'est le dossier du dépôt en cours qui va être converti vers un nouveau dépôt. | + | </code> |
| - | </WRAP> | + | |
| - | [[https:// | + | ====Configurer |
| - | ====Fusionner deux dépôts en un seul==== | + | Pour importer une clé privée : |
| - | Depuis le projet A : | + | <code bash> |
| + | gpg --import file.key | ||
| + | </ | ||
| + | Si on souhaite ajouter la signature des commits pour tous les projets. | ||
| <code bash> | <code bash> | ||
| - | git remote add -f Bproject path/to/B | + | git config |
| - | git merge -s ours --no-commit --allow-unrelated-histories Bproject/ | + | git config |
| - | rm -Rf path/to/B | + | |
| - | git read-tree --prefix=path/ | + | |
| - | git commit | + | |
| </ | </ | ||
| - | Supprimer | + | ====Mettre à jour la clé==== |
| + | |||
| + | Il faut connaître | ||
| <code bash> | <code bash> | ||
| - | git add .gitmodules | + | gpg --list-keys --keyid-format=long |
| - | git commit | + | |
| </ | </ | ||
| - | [[https:// | + | Le numéro de la clé est celui du pub après l' |
| - | Ou | + | < |
| + | pub | ||
| + | XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| + | uid [ unknown] USERNAME < | ||
| + | sub | ||
| + | |||
| + | ====Date d' | ||
| + | |||
| + | Pour mettre à jour la date d' | ||
| <code bash> | <code bash> | ||
| - | cd main | + | gpg --edit-key KEY_ID |
| - | # Cette commande doit impérativement être lancée depuis la racine du dépôt git et pas à l' | + | list |
| - | git fetch ../other master: | + | key 0 |
| - | git checkout tmp | + | expire |
| - | git filter-branch | + | key 1 |
| - | ' | + | expire |
| - | | + | save |
| - | git update-index --index-info && | + | |
| - | mv " | + | |
| - | git rebase master | + | |
| - | git checkout master | + | |
| - | git merge tmp | + | |
| - | git branch -d tmp | + | |
| - | git update-ref -d refs/ | + | |
| </ | </ | ||
| - | [[https:// | + | Ne pas choisir une date d' |
| + | Pour la mettre à jour sur GitHub, il faut supprimer la clé publique précédente avant de la rajouter. Sinon GitHub détecte que la clé publique a déjà été importée mais il ne détecte pas le changement de date. | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ====Cloner==== | ||
| + | |||
| + | <code bash> | ||
| + | git clone https:// | ||
| + | </ | ||
| + | |||
| + | * Ne pas télécharger l' | ||
| + | |||
| + | Pratique pour ne faire que de la compilation et alléger le téléchargement. | ||
| + | |||
| + | Ajouter '' | ||
| + | |||
| + | * Télécharger uniquement une seule branche | ||
| + | |||
| + | git clone --single-branch --branch llvmorg-8.0.0 https:// | ||
| - | ====Dupliquer un dépôt==== | + | ====Dupliquer un dépôt |
| Il faut commencer par le cloner si ce n'est pas déjà fait. | Il faut commencer par le cloner si ce n'est pas déjà fait. | ||
| Ligne 163: | Ligne 180: | ||
| [[https:// | [[https:// | ||
| + | |||
| + | =====Submodules===== | ||
| + | |||
| + | ====Supprimer un submodule==== | ||
| + | |||
| + | <code bash> | ||
| + | git submodule deinit < | ||
| + | git rm < | ||
| + | git commit -m " | ||
| + | rm -rf .git/ | ||
| + | </ | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ====Changer l' | ||
| + | |||
| + | <code bash> | ||
| + | git submodule set-url -- < | ||
| + | </ | ||
| =====Branches===== | =====Branches===== | ||
| + | |||
| ====Mettre à jour une branche qui s'est éloignée du maître==== | ====Mettre à jour une branche qui s'est éloignée du maître==== | ||
| + | |||
| [[https:// | [[https:// | ||
| Ligne 222: | Ligne 260: | ||
| Il est interdit d' | Il est interdit d' | ||
| + | |||
| + | ====Se resynchroniser après qu'un projet ait accepté la pull request==== | ||
| + | |||
| + | Ou le syndrome github du '' | ||
| + | <code bash> | ||
| + | git remote add upstream git:// | ||
| + | git fetch upstream | ||
| + | git checkout master | ||
| + | git merge upstream/ | ||
| + | </ | ||
| + | [[https:// | ||
| + | |||
| + | [[https:// | ||
| =====Commit===== | =====Commit===== | ||
| + | |||
| ====Tags==== | ====Tags==== | ||
| + | |||
| Suppression d'un tag déjà push | Suppression d'un tag déjà push | ||
| <code bash> | <code bash> | ||
| Ligne 237: | Ligne 290: | ||
| ====Annulation d'une modification non encore " | ====Annulation d'une modification non encore " | ||
| + | |||
| <code bash> | <code bash> | ||
| git checkout -- < | git checkout -- < | ||
| Ligne 242: | Ligne 296: | ||
| ====Afficher les différences==== | ====Afficher les différences==== | ||
| + | |||
| Avant '' | Avant '' | ||
| <code bash> | <code bash> | ||
| Ligne 255: | Ligne 310: | ||
| ====Trouver le commit à l' | ====Trouver le commit à l' | ||
| + | |||
| <code bash> | <code bash> | ||
| git bisect start | git bisect start | ||
| Ligne 283: | Ligne 339: | ||
| Il est théoriquement inutile de supprimer le dossier de compilation et de repartir à chaque fois à 0. Mais, parfois, le système de compilation (autotools) se trompe dans les dépendances et ne recompile pas tout ce qui devrait l' | Il est théoriquement inutile de supprimer le dossier de compilation et de repartir à chaque fois à 0. Mais, parfois, le système de compilation (autotools) se trompe dans les dépendances et ne recompile pas tout ce qui devrait l' | ||
| - | ====Se resynchroniser après qu'un projet ait accepté la pull request==== | + | ====Importer |
| - | Ou le syndrome github du '' | + | |
| - | <code bash> | + | |
| - | git remote add upstream git:// | + | |
| - | git fetch upstream | + | |
| - | git checkout master | + | |
| - | git merge upstream/ | + | |
| - | </ | + | |
| - | [[https:// | + | |
| - | [[https:// | ||
| - | |||
| - | ====Changer le message de tous les commit automatiquement==== | ||
| - | git filter-branch -f --msg-filter 'sed " | ||
| - | Cela enlève toutes les lignes commençant par '' | ||
| - | |||
| - | ====Importer un commit depuis un autre dépôt==== | ||
| Il faut ajouter le nouveau dépôt, faire un fetch puis utiliser la commande '' | Il faut ajouter le nouveau dépôt, faire un fetch puis utiliser la commande '' | ||
| Ligne 317: | Ligne 358: | ||
| git cherry-pick -Xrename-threshold=5% -x SHA | git cherry-pick -Xrename-threshold=5% -x SHA | ||
| </ | </ | ||
| + | |||
| ====Importer seulement un fichier d'un commit==== | ====Importer seulement un fichier d'un commit==== | ||
| + | |||
| <code bash> | <code bash> | ||
| git show SHA -- file1.txt file2.txt | git apply - | git show SHA -- file1.txt file2.txt | git apply - | ||
| Ligne 341: | Ligne 384: | ||
| Mais attention, en cas de signature avec une clé GPG, la date du commit sera toujours l' | Mais attention, en cas de signature avec une clé GPG, la date du commit sera toujours l' | ||
| - | =====Subtree===== | ||
| - | Les subtree utilisent les '' | ||
| - | ====Ajout d' | + | ====Signer tous les commits existants==== |
| + | |||
| + | Cela réécrit tout l' | ||
| + | |||
| + | git filter-branch -f --commit-filter 'git commit-tree -S " | ||
| + | git push -f | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ====Avoir tous les enfants | ||
| <code bash> | <code bash> | ||
| - | git remote add -f name url_repository | + | find_descendants() { |
| - | git subtree add --prefix folder url_repository branch | + | local sha=$1 |
| + | line=$(git rev-list --all --children | grep ^$sha) | ||
| + | |||
| + | if [[ $line == *" "* ]]; then | ||
| + | children=$(echo $line | cut -d' ' | ||
| + | for child in $children; do | ||
| + | echo $child | ||
| + | find_descendants $child | ||
| + | done | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | find_descendants $1 | ||
| </ | </ | ||
| - | avec : | ||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | Dans le cas d'une architecture '' | + | =====État du dépôt===== |
| - | '' | + | ====Si des fichiers ont été modifiés==== |
| - | ====pusher un subtree==== | + | <code bash> |
| - | Faire un commit de façon traditionnelle. | + | if [[ ! -z "$(git status --porcelain --ignore-submodules)" |
| + | then | ||
| + | echo "Some files has been modified." | ||
| + | exit 1 | ||
| + | fi; | ||
| + | </ | ||
| - | La technique consiste à '' | + | Pour utiliser |
| - | git subtree push --prefix=folder remote_name branch | + | ====Si des fichiers non ignorés ont été ajoutés==== |
| - | Mais en faisant simplement çà, on se retrouve avec des commits différents entre le dépot principal et le dépot '' | + | <code bash> |
| + | if [ -n "$(git ls-files --others --exclude-standard)" | ||
| + | </ | ||
| - | ====Récupérer les modifications d'une branche==== | + | =====Maintenance===== |
| - | git subtree pull --prefix=folder remote_name branch | + | ====Changer l' |
| - | Et c'est très moche dans l'historique de git : | + | Pour connaître |
| + | <code bash> | ||
| + | git remote -v | ||
| + | </ | ||
| - | {{:prog:git:git_historique_subtree.png|Historique | + | Pour la modifier |
| + | <code bash> | ||
| + | git remote set-url origin https:// | ||
| + | </ | ||
| - | En plus, dans le '' | + | [[https:// |
| - | Je ne comprends pas pourquoi les '' | + | ====Déplacer un dossier vers au nouveau dépôt==== |
| - | [[https:// | + | <WRAP center round important 60%> |
| + | Il faut créer un double | ||
| + | </WRAP> | ||
| - | [[https://gauthier.frama.io/post/git-subtree/|Git subtree: une alternative à Git submodule]] {{ :prog:git:git_subtree_une_alternative_a_git_submodule_le_blog_de_gauthier_2019-10-07_00_00_35_.html |Archive | + | [[https://help.github.com/articles/splitting-a-subfolder-out-into-a-new-repository/|Splitting a subfolder out into a new repository]] {{ :prog:git:splitting_a_subfolder_out_into_a_new_repository_-_github_help_2019-10-22_13_30_27_.html |Archive le 22/10/2019}} |
| - | [[https://tsh.io/blog/git-subtree-or-how-i-stopped-worrying-and-learned-to-love-external-dependencies/|Git subtree | + | ====Fusionner deux dépôts en un seul et en conservant l' |
| + | |||
| + | Depuis le projet A : | ||
| + | |||
| + | <code bash> | ||
| + | git remote add -f Bproject path/to/B | ||
| + | git merge -s ours --no-commit --allow-unrelated-histories Bproject/ | ||
| + | rm -Rf path/to/B | ||
| + | git read-tree --prefix=path/ | ||
| + | git commit -m "Merge B project as our subdirectory" | ||
| + | </ | ||
| + | |||
| + | Supprimer le submodule des fichiers '' | ||
| + | |||
| + | <code bash> | ||
| + | git add .gitmodules | ||
| + | git commit -m " | ||
| + | </ | ||
| + | |||
| + | [[https://stackoverflow.com/questions/ | ||
| + | |||
| + | Ou | ||
| + | |||
| + | <code bash> | ||
| + | cd main | ||
| + | # Cette commande doit impérativement être lancée depuis la racine du dépôt git et pas à l' | ||
| + | git fetch ../other master: | ||
| + | git checkout tmp | ||
| + | git filter-branch --index-filter \ | ||
| + | 'git ls-files -s | sed " | ||
| + | GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ | ||
| + | git update-index --index-info && | ||
| + | mv " | ||
| + | git rebase master | ||
| + | git checkout master | ||
| + | git merge tmp | ||
| + | git branch -d tmp | ||
| + | git update-ref -d refs/ | ||
| + | </ | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ====Vérifie l' | ||
| + | |||
| + | <code bash> | ||
| + | git fsck --no-dangling | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | $ git fsck --no-dangling | ||
| + | error: corrupt loose object ' | ||
| + | error: unable to unpack contents of .git/ | ||
| + | error: 2a9e451f85ba5e26dbe34d742105e877b0942570: | ||
| + | Checking object directories: | ||
| + | Checking objects: 100% (812/812), done. | ||
| + | missing tree 2a9e451f85ba5e26dbe34d742105e877b0942570 | ||
| + | </ | ||
| + | |||
| + | ====Savoir à quel commit appartient un blob==== | ||
| + | |||
| + | <code bash> | ||
| + | git log --raw --all --find-object=< | ||
| + | </ | ||
| + | |||
| + | et pour un objet LFS | ||
| + | |||
| + | <code bash> | ||
| + | git log -S< | ||
| + | </ | ||
| + | |||
| + | ====Suppression des dangling blobs==== | ||
| + | |||
| + | Ces commits inachevés sont détectés par la commande | ||
| + | <code bash> | ||
| + | git fsck | ||
| + | git reflog expire --expire-unreachable=now --expire=now --all --dry-run | ||
| + | git reflog expire --expire-unreachable=now --expire=now --all | ||
| + | git gc --prune=now | ||
| + | git repack | ||
| + | </ | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ====Ne garder que la dernière version après un git pull==== | ||
| + | |||
| + | <code bash> | ||
| + | git checkout --orphan master | ||
| + | git gc --prune=all | ||
| + | </ | ||
| + | |||
| + | ====Supprimer les branches locales qui ont été supprimées sur le dépôt distant==== | ||
| + | |||
| + | <code bash> | ||
| + | git fetch -p | ||
| + | git branch --merged main | grep -v '^[ *]*main$' | ||
| + | </ | ||
| + | |||
| + | Bien mettre à jour '' | ||
| + | |||
| + | [[https:// | ||
| =====Historique===== | =====Historique===== | ||
| + | |||
| ====Chercher dans le code sur l' | ====Chercher dans le code sur l' | ||
| + | |||
| git grep < | git grep < | ||
| Attention, cela cherche dans tous les fichiers, pas uniquement dans les modifications du commit. | Attention, cela cherche dans tous les fichiers, pas uniquement dans les modifications du commit. | ||
| ====Chercher dans le code uniquement les modifications==== | ====Chercher dans le code uniquement les modifications==== | ||
| + | |||
| git log -S"a chercher" | git log -S"a chercher" | ||
| ====Trouver le commit qui supprime un fichier==== | ====Trouver le commit qui supprime un fichier==== | ||
| + | |||
| Il n'y a pas moyen. Mais on peut retrouver tous les commits modifiant un fichier précis. | Il n'y a pas moyen. Mais on peut retrouver tous les commits modifiant un fichier précis. | ||
| git log --full-history -- your_file | git log --full-history -- your_file | ||
| Ligne 399: | Ligne 576: | ||
| ====Chercher une modification également dans les sous-modules==== | ====Chercher une modification également dans les sous-modules==== | ||
| + | |||
| git submodule foreach git log -S" | git submodule foreach git log -S" | ||
| + | |||
| + | ====Changer le message de tous les commit automatiquement==== | ||
| + | git filter-branch -f --msg-filter 'sed " | ||
| + | Cela enlève toutes les lignes commençant par '' | ||
| ====Annuler temporairement des modifications==== | ====Annuler temporairement des modifications==== | ||
| + | |||
| Les modifications sont stockés sous forme d'une liste FILO. | Les modifications sont stockés sous forme d'une liste FILO. | ||
| * Stocke les modifications dans une zone '' | * Stocke les modifications dans une zone '' | ||
| Ligne 419: | Ligne 602: | ||
| ====Ignorer certains commits avec blame==== | ====Ignorer certains commits avec blame==== | ||
| + | |||
| Inscrire les numéros de commit (un par ligne) dans un fichier '' | Inscrire les numéros de commit (un par ligne) dans un fichier '' | ||
| Ligne 433: | Ligne 617: | ||
| [[https:// | [[https:// | ||
| - | =====État du dépôt===== | + | =====Subtree===== |
| - | ====bash==== | + | Les subtree utilisent les '' |
| - | * Si des fichiers ont été modifiés | + | ====Ajout d'un subtree==== |
| <code bash> | <code bash> | ||
| - | if [[ ! -z "$(git status | + | git remote add -f name url_repository |
| - | then | + | git subtree add --prefix folder url_repository branch |
| - | echo "Some files has been modified." | + | |
| - | exit 1 | + | |
| - | fi; | + | |
| </ | </ | ||
| - | Pour utiliser | + | avec : |
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| - | * Si des fichiers non ignorés ont été ajoutés | + | Dans le cas d'une architecture '' |
| - | <code bash> | + | '' |
| - | if [ -n "$(git ls-files --others --exclude-standard)" | + | |
| - | </ | + | |
| - | =====Maintenance===== | + | ====pusher |
| - | ====Vérifie l' | + | |
| - | <code bash> | + | Faire un commit de façon traditionnelle. |
| - | git fsck --no-dangling | + | |
| - | </ | + | |
| - | < | + | La technique consiste à '' |
| - | $ git fsck --no-dangling | + | |
| - | error: corrupt loose object | + | |
| - | error: unable to unpack contents of .git/ | + | |
| - | error: 2a9e451f85ba5e26dbe34d742105e877b0942570: | + | |
| - | Checking object directories: | + | |
| - | Checking objects: 100% (812/812), done. | + | |
| - | missing tree 2a9e451f85ba5e26dbe34d742105e877b0942570 | + | |
| - | </ | + | |
| - | ====Suppression des dangling blobs==== | + | |
| - | Ces commits inachevés sont détectés par la commande | + | |
| - | <code bash> | + | |
| - | git fsck | + | |
| - | git reflog expire --expire-unreachable=now --expire=now --all --dry-run | + | |
| - | git reflog expire --expire-unreachable=now --expire=now --all | + | |
| - | git gc --prune=now | + | |
| - | git repack | + | |
| - | </ | + | |
| - | [[https:// | + | |
| - | ====Ne garder que la dernière version après un git pull==== | + | Mais en faisant simplement çà, on se retrouve avec des commits différents entre le dépot principal et le dépot '' |
| - | <code bash> | + | |
| - | git checkout --orphan master | + | |
| - | git gc --prune=all | + | |
| - | </ | + | |
| - | ====Supprimer un submodule==== | + | ====Récupérer les modifications d'une branche==== |
| - | | + | git subtree pull --prefix=folder remote_name branch |
| - | * '' | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | [[https:// | + | Et c'est très moche dans l' |
| - | ====Changer l' | + | {{: |
| - | <code bash> | + | En plus, dans le '' |
| - | git submodule set-url -- < | + | |
| - | </ | + | |
| - | ====Signer tous les commits existants==== | + | Je ne comprends pas pourquoi |
| - | git filter-branch -f --commit-filter | + | |
| - | git push -f | + | |
| - | [[https://stackoverflow.com/questions/13043357/git-sign-off-previous-commits|Git sign off previous commits?]] {{ :prog:git:git_sign_off_previous_commits_-_stack_overflow_2019-10-22_13_32_56_.html |Archive du 24/10/2012 le 22/10/2019}} | + | [[https://delicious-insights.com/fr/articles/git-subtrees/|Comprendre et maîtriser les subtrees |
| - | ====Supprimer les branches locales qui ont été supprimées sur le dépôt distant==== | + | [[https:// |
| - | <code bash> | + | [[https:// |
| - | git fetch -p | + | |
| - | git branch | + | |
| - | </code> | + | |
| - | [[https:// | + | =====Best partices===== |
| - | =====Clés publiques | + | ====Un dépôt global ou un dépôt par projet |
| - | Pour signer les commits, il faut commencer | + | Je conseille un projet |
| - | ====Génération de la clé==== | + | L' |
| - | <code bash> | + | ===Nombres de dépôts=== |
| - | gpg --full-generate-key | + | |
| - | </ | + | |
| - | Choisir une clé ''RSA et RSA'' | + | Séparer les dépôts réduit le nombre de dépendances de chaque projet car chaque projet n'importe que ses dépendances. |
| - | ====Afficher | + | Mais avoir de nombreux projets nécessite plus de travail pour la synchronisation |
| - | <code bash> | + | ===Gestion des dépendances=== |
| - | gpg --list-secret-keys --keyid-format LONG | + | |
| - | </ | + | |
| - | Avec '' | + | * Super projet contenant les submodules à la racine |
| - | Pour exporter la clé publique | + | Exemple [[https:// |
| - | <code bash> | + | Inconvénients : |
| - | gpg --armor --export YYYYYYYYY | + | |
| - | </ | + | |
| - | Pour exporter la clé privée | + | - Nécessite un super projet pour compiler. Au choix : soit un super projet qui clone tout (Boost), soit un super projet par projet à compiler. |
| + | - Dépendances circulaires difficilement détectables entre projets. | ||
| - | <code bash> | + | * Submodule dans chaque projet |
| - | gpg --export-secret-keys YYYYYYYYY > file.key | + | |
| - | </ | + | |
| - | ====Configurer git==== | + | Inconvénients : |
| - | Pour importer | + | - Clonage récursif infini si dépendances circulaires. |
| + | - Si 2 librairies dépendent d'une même 3ème, la 3ème peut être a des versions différentes sur les 2 premières librairies. | ||
| - | <code bash> | + | * Gestionnaire externe (vcpkg) |
| - | gpg --import file.key | + | |
| - | </ | + | |
| - | Si on souhaite ajouter la signature des commits pour tous les projets. | + | Inconvénients : |
| - | <code bash> | + | |
| - | git config --global user.signingkey YYYYYYYYY | + | |
| - | git config --global commit.gpgsign true | + | |
| - | </ | + | |
| - | ====Mettre | + | - Travail supplémentaire pour maintenir les ports vcpkg. Dans le cas de vcpkg, il faut créer un port par branche de dev et l' |
| + | - Si on travaille sur des dépendances, | ||
| - | Il faut connaître le numéro de la clé. | + | ====Rebase / amend / force push==== |
| - | <code bash> | + | Faut-il autoriser les rebases ou non ? Il y a 2 parties irréconciliables : avoir un arbre git propre (et autoriser les rebases) et avoir un arbre qui mémorise l' |
| - | gpg --list-keys --keyid-format=long | + | |
| - | </code> | + | |
| - | Le numéro de la clé est celui du pub après | + | ===Retravailler |
| - | < | + | |
| - | pub | + | |
| - | XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | + | |
| - | uid [ unknown] USERNAME < | + | |
| - | sub | + | |
| - | ===Date d'expiration=== | + | Je suis pour les modifications. C'est un espace de travail et de bac à sable qui peut être utilisé pour tester le code sur la CI. De plus, ça permet de sauvegarder le code quotidiennement et de voir l' |
| - | Pour mettre à jour la date d'expiration, il faut faire : | + | ⚠️ Autoriser de retravailler une branche interdit de se greffer sur une branche de développement |
| - | <code bash> | + | Par contre, il ne faut fusionner que les commits qui concerne une même tâche et ne pas fusionner tout l' |
| - | gpg --edit-key KEY_ID | + | |
| - | list | + | |
| - | key 0 | + | |
| - | expire | + | |
| - | key 1 | + | |
| - | expire | + | |
| - | save | + | |
| - | </ | + | |
| - | Ne pas choisir une date d'expiration supérieure à 1 an. C'est la limite de sécurité généralement considérée comme sûr. | + | * Modifier le commit de base d'une racine |
| - | Pour la mettre | + | Lors d'un merge, il faut utiliser '' |
| + | |||
| + | L' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Mais plutôt d' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Oui, c'est plus joli. Mais est-ce c'est nécessaire de l' | ||
| + | |||
| + | Si beaucoup de personnes travaillent en même temps sur le projet, l' | ||
| + | |||
| + | S'il n'y a pas de conflit lors du merge, ne pas l' | ||
| + | |||
| + | En cas de conflit lors du merge, il ne faut pas résoudre le conflit en local avant de merger. Sinon, la résolution des conflits seront dans le commit de merge et c'est contre-intuitif de lire le commit de merge pour lire les modifications. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Il faut appliquer la technique de Gitlab avec le double merge. On merge la branche de destination vers la branche de dev pour résoudre les conflits puis on merge la branche de dev vers la branche de destination. Il y a toujours un commit de merge qui contient la résolution des conflits | ||
| + | |||
| + | {{: | ||
| + | |||
| + | On peut aussi faire des rebases régulièrement afin d' | ||
| - | [[https:// | ||
| =====Messages d' | =====Messages d' | ||
| + | |||
| ====warning: | ====warning: | ||
| + | |||
| C'est généralement affiché lors d'un '' | C'est généralement affiché lors d'un '' | ||
| + | |||
| ====warning: | ====warning: | ||
| + | |||
| git config XXX YYY | git config XXX YYY | ||
| ====git describe==== | ====git describe==== | ||
| + | |||
| * '' | * '' | ||
| Ligne 635: | Ligne 786: | ||
| L' | L' | ||
| - | =====Windows===== | + | ====error: object file .git/objects/a3/ |
| - | [[https:// | + | |
| - | [[http:// | + | Pour éviter de devoir tout cloner à nouveau et devoir tout recompiler, il faut tester |
| - | =====Github===== | + | <code bash> |
| + | find .git/ | ||
| + | git fetch | ||
| + | </ | ||
| - | ====Personal access token==== | + | [[https:// |
| - | Pour pouvoir pousser sur un dépôt en utilisant un token plutôt que le mot de passe du site, il faut : | + | ====gpg: keydb_search failed: Invalid argument==== |
| - | * Générer le token dans les [[https:// | + | < |
| - | * Créer un nouveau token avec les droits | + | gpg: keydb_search failed: Invalid argument |
| - | * Noter la clé, | + | gpg: skipped " |
| - | * Puis, au moment de faire un '' | + | [GNUPG:] INV_SGNR |
| - | + | [GNUPG:] FAILURE sign XXXXXXXXX | |
| - | =====Third party===== | + | gpg: signing failed: Invalid argument |
| - | + | ||
| - | ====Gource==== | + | |
| - | + | ||
| - | Programme de visualisation sous forme de vidéos des dépôts github. | + | |
| - | + | ||
| - | Le dépôt est représenté sous forme d'un arbre. Le dossier est une branche et les fichiers sont des feuilles. | + | |
| - | + | ||
| - | Puis on voit où chaque contributeur contribue au fil du temps. | + | |
| - | + | ||
| - | Commandes | + | |
| - | + | ||
| - | <code bash> | + | |
| - | gource -1280x720 -o gource.ppm | + | |
| - | ffmpeg -y -r 60 -f image2pipe -vcodec ppm -i gource.ppm -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -crf 24 -threads 8 gource.mp4 | + | |
| </ | </ | ||
| - | Attention, l'encodage est mauvais dans les dégradés sombres. Il faudra accepter une vidéo de faible taille avec des carrés ou mettre un crf très faible (< 15) avec une vidéo de très grosse taille. | + | Supprimer le dossier |
prog/git.1712333734.txt.gz · Dernière modification : de 47.128.22.190
