En une commande :
git commit --amend --date=now
Je fais trop de Git en ce moment (>_<)
J'ai eu le besoin de nettoyer des tonnes et des tonnes de features-branches non-mergées et abandonnées dans nos répos Git. J'ai donc écrit un petit script bash qui va lister toutes les branches dont l'âge dépasse le nombre de jours indiqués en paramètre.
Utilisation
# Va lister toutes les branches qui n'ont pas bougées depuis plus de 180 jours
$ git-unused-branches 180
Le script
#!/usr/bin/env bash
if [ "$1" == "" ]; then
echo "Usage: git-too-old-branches <NB_DAYS>"
echo ""
echo "( NB_DAYS The lower age limit filter of branches"
echo " to list"
echo ""
echo "Example"
echo " To list any branches which has not been"
echo " changed since 90 days use :"
echo " git-unused-branches 90"
exit 1
fi
NB_DAYS="${1}"
SECONDS_IN_DAY=86400
TODAY_EPOCH_TIME=$(date +"%s")
## List everything expect
## - Production branches
## - Renovate branches
## - HEAD (master)
list_branches() {
local branches
branches=$(git branch -r | grep -v -E "origin/HEAD|origin/production|origin/renovate" | sed "s/ //" | sort)
echo "${branches}"
}
filter_branch() {
local ageGap
local branch
local branchAge
local maxDays
branch="${1}"
branchAge=$(git log "$branch" -n 1 --format=%ct)
ageGap=$(((TODAY_EPOCH_TIME-branchAge)/SECONDS_IN_DAY))
if (( ${ageGap} > ${NB_DAYS} )); then
echo "$branch is [$ageGap] days old"
fi
}
main() {
local branches
branches=$(list_branches)
for branch in ${branches}
do
filter_branch "${branch}"
done
}
main
En espérant que ça puisse aider certains :P
En quatre étapes :
1) Récupérer le certificat au format TXT
openssl s_client -connect mon-domaine:443 > mon-certif.pem
2) Nettoyer le fichier TXT pour ne garder que ce qu'il y a entre les sections BEGIN CERTIFICATE
et END CERTIFICATE
inclus, par exemple :
-----BEGIN CERTIFICATE-----
MIIDnzCCAocCBE/xnXAwDQYJKoZIhvcNAQEFBQAwgZMxCzAJBgNVBAYTAkRFMRUw
EwYDVQQIEwxMb3dlciBTYXhvbnkxEjAQBgNVBAcTCVdvbGZzYnVyZzEYMBYGA1UE
ChMPU2FhUy1TZWN1cmUuY29tMRowGAYDVQQDFBEqLnNhYXMtc2VjdXJlLmNvbTEj
MCEGCSqGSIb3DQEJARYUaW5mb0BzYWFzLXNlY3VyZS5jb20wHhcNMTIwNzAyMTMw
OTA0WhcNMTMwNzAyMTMwOTA0WjCBkzELMAkGA1UEBhMCREUxFTATBgNVBAgTDExv
d2VyIFNheG9ueTESMBAGA1UEBxMJV29sZnNidXJnMRgwFgYDVQQKEw9TYWFTLVNl
Y3VyZS5jb20xGjAYBgNVBAMUESouc2Fhcy1zZWN1cmUuY29tMSMwIQYJKoZIhvcN
AQkBFhRpbmZvQHNhYXMtc2VjdXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAMUZ472W3EVFYGSHTgFV0LR2YVE1U//sZimhCKGFBhH3ZfGwqtu7
mzOhlCQef9nqGxgH+U5DG43B6MxDzhoP7R8e1GLbNH3xVqMHqEdcek8jtiJvfj2a
pRSkFTCVJ9i0GYFOQfQYV6RJ4vAunQioiw07OmsxL6C5l3K/r+qJTlStpPK5dv4z
Sy+jmAcQMaIcWv8wgBAxdzo8UVwIL63gLlBz7WfSB2Ti5XBbse/83wyNa5bPJPf1
U+7uLSofz+dehHtgtKfHD8XpPoQBt0Y9ExbLN1ysdR9XfsNfBI5K6Uokq/tVDxNi
SHM4/7uKNo/4b7OP24hvCeXW8oRyRzpyDxMCAwEAATANBgkqhkiG9w0BAQUFAAOC
AQEAp7S/E1ZGCey5Oyn3qwP4q+geQqOhRtaPqdH6ABnqUYHcGYB77GcStQxnqnOZ
MJwIaIZqlz+59taB6U2lG30u3cZ1FITuz+fWXdfELKPWPjDoHkwumkz3zcCVrrtI
ktRzk7AeazHcLEwkUjB5Rm75N9+dOo6Ay89JCcPKb+tNqOszY10y6U3kX3uiSzrJ
ejSq/tRyvMFT1FlJ8tKoZBWbkThevMhx7jk5qsoCpLPmPoYCEoLEtpMYiQnDZgUc
TNoL1GjoDrjgmSen4QN5QZEGTOe/dsv1sGxWC+Tv/VwUl2GqVtKPZdKtGFqI8TLn
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----
3) Dire à git d'aller chercher ce certificat
git config --global http.sslCAInfo /mon/chemin/vers/mon/certif.pem
4) S'assurer que la vérification SSL/TLS n'est pas désactivée dans Git
git config --global http.sslVerify true
@Gégé totalement d'accord avec toi ! Même remarque au sujet du man
sous Linux. Si tu ne sais pas déjà ce dont tu as besoin, alors il ne te sera d'aucune utilité.
C'est un vrai problème d'une manière générale dans le monde du logiciel libre. Les documentations techniques internes au projet sont considérées comme des documentations utilisateurs. Comme s'il y avait un plaisir personnel à apprendre un truc ultra complexe pour une utilisation jetable. À chaque fois ça ce raisonnement me dépasse.
C'est l'un des rares reproches que je fais régulièrement à l'open source.
Dans votre fichier ~/.cargo/config.toml
ajouter la configuration suivante
[registry]
default = "gitea"
[registries.gitea]
index = "https://mycompany.com/gitea/my-rust-repository.git"
[net]
git-fetch-with-cli = true
N.B : Je publie cette configuration ici mais je ne l'ai pas encore testée.
En une ligne :
git commit --amend --date=now
Merci @duraffort pour le lien
Merci Oros !
En plusieurs commandes en fonction des cas :
1) Tout cracher en une seule fois
git --no-pager log --pretty=tformat:"%C(yellow)%h %C(cyan)%ad %Cblue%an%C(auto)%d %Creset%s" --graph --date=format:"%Y-%m-%d %H:%M"
2) Avec pagination et le graphe des merges
git log --pretty=tformat:"%C(yellow)%h %C(cyan)%ad %Cblue%an%C(auto)%d %Creset%s" --graph --date=format:"%Y-%m-%d %H:%M"
3) Juste ce qu'il faut
git log --pretty=tformat:"%C(yellow)%h %C(cyan)%ad %Cblue%an%C(auto)%d %Creset%s" --date=format:"%Y-%m-%d %H:%M"
En un oneliner :
git stash -- $(git diff --staged --name-only)
Pour faire le diff entre deux branches :
# Diff entre le HEAD des deux branches
git diff master..ma-branch
# Diff entre le point de bifurcation de "ma-branch" dans master et le HEAD de "ma-branche"
git diff master...ma-branch
En étape (4) j'aurai réécrit l'historique de la branche sur la branche elle-même en faisant git push --force origin ma-branche
à la place de git push --force origin master
.
Cela a plusieurs avantages :
1) Je ne force pas la réécriture du master
à chaque fois, ce qui obligerait tout le monde à mettre à jour son HEAD si des merges sont fréquents de cette branche vers lui.
2) Cela permet encore d'effectuer une PR/MR pour une review de code.
3) Cela permet de travailler sur la branche sans perturber les autres.
4) Je peux rebase
ma branche autant de fois que nécessaire sans impact sur master
.
Je le note pour @Kysofer qui doit gérer une PIC.
Si vos requêtes de push/pull/clone sont trop grosses et que Git vous affiche une erreur du type Github Push Error: RPC failed; result=22, HTTP code = 413
alors vous avez probablement deux choses à faire :
1) Augmenter la taille du buffer côté Git.
J'ai fixé la valeur à 1 Gio, car tous mes PC ont au moins 8 Go de RAM et tournent sous Linux. À noter que cela a grandement accéléré mes requêtes de pull/push/clone (je suis passée de 4 Mo/sec à 25 Mo/sec) :
git config --global http.postBuffer 1073741824
2) Augmenter la taille du cache côté Nginx s'il est en front à votre serveur Git (Gitea chez moi).
client_max_body_size 512m;
Et ne pas oublier de redémarrer Nginx via un systemctl restart nginx
.
Très pratique pour nettoyer toutes les feature branches récupérées au fil du temps. Bref, le nettoyage se fait en deux commandes :
# Récupérer de tout le contenu distant (hors tags)
git pull --all
# Suppression des branches locales
git remote update origin --prune
Une fois encore, GitLab explique en quoi GitFlow est over-engineered pour rien (mais certains aiment créer des branches).
J'ai pris le temps de lire les commentaires et j'ai tout de même appris une chose : je n'embaucherai pas messieurs Mark Norton, Darrell Tunnell et Abdoulaye Siby car ils n'argumentent pas, ils ne font que donner leur ressenti personnel, ressenti fondé sur des habitudes pluriannuelles qui les ont déformés.
Du reste, GitFlow étant déjà aux toilettes depuis un bon moment me concernant, je vais m’empresser de tirer la chasse au cas où il ne soit toujours pas parti.
Et merci à Philou pour le troll lien.
Des add-ons pour booster votre install Git. Merci @Philou pour le lien.
Alors ça c'est typiquement le genre de trucs que je poste pour @Philou à présent ! Rien que la syntaxe fait penser à mon bien aimé Mercurial 😍.
Via Riduidel.
Sûrement l'un des meilleurs message de commit au monde. Non pas parce que le ratio code/message est complètement barré mais parce qu'il explique pourquoi ce commit existe et non pas ce qu'il a modifié. Dit autrement, avec un moteur de recherche qui taperait dans les logs, chaque répo Git deviendrait une base de connaissance équivalente à StackOverflow.
Et Epstein ne s'est pas tué lui-même dans sa cellule #Epstein.
Coudifié ! Tout est dans le titre.
Le concept du Test, Commit, Revert (TCR) est sympa.
Comment notre façon de programmer est-elle devenue asynchrone et bloquante ? C'est vrai que je passe mon temps à revenir sur des pull-requests qui ont eu lieu plusieurs jours auparavant ; et c'est dur à chaque fois ! J'aime coder et oublier le code que je viens de coder aussitôt que la PR part. Je n'aime pas qu'on me relance sur un sujet que j'ai fermé car c'est une charge cognitive forte et épuisante et pourtant ce modèle est devenu le modèle "standard".
=> Pour @Chlouchloutte
Via Riduidel