Sam & Max: Python, Django, Git et du cul » git http://sametmax.com Deux développeurs en vadrouille qui se sortent les doigts du code Wed, 05 Feb 2014 14:20:37 +0000 en hourly 1 http://wordpress.org/?v=3.3.1 Marre des mots de passe pour push sur git ? http://sametmax.com/marre-des-mots-de-passe-pour-push-sur-git/ http://sametmax.com/marre-des-mots-de-passe-pour-push-sur-git/#comments Tue, 19 Nov 2013 08:36:34 +0000 Sam http://sametmax.com/?p=8013 Vous êtes dans une situation où vous ne pouvez pas utiliser uniquement une clé pour vous authentifier, et il faut taper votre putain de mot de passe à chaque push.

Ça sent le vécu n’est-ce pas ?

Mais bien entendu git vient avec une option bien cachée au fond de son fion pour adresser ce problème :

git config credential.helper 'cache --timeout=3600'

Et votre authentification sera gardée en mémoire pour une heure. Vous pouvez faire :

git config --global credential.helper 'cache --timeout=3600'

Pour l’étendre à tous les repos de votre machine.

flattr this!

]]>
http://sametmax.com/marre-des-mots-de-passe-pour-push-sur-git/feed/ 12
Git push via HTTP (ou comment travailler au MacDo) http://sametmax.com/git-push-via-http-ou-comment-travailler-au-macdo/ http://sametmax.com/git-push-via-http-ou-comment-travailler-au-macdo/#comments Mon, 19 Aug 2013 18:03:53 +0000 Sam http://sametmax.com/?p=647 Hier, j’ai dû pusher du Mac Do. Parce que je suis dans un pli d’une circonvolution du sphincter du trou du cul du monde, à savoir chez mes grands-parents. Inutile de dire que j’avais un meilleur accès Internet à Kisumu, au Kenya. Si, si.

Bien entendu, le Mac wifi est annoncé comme “Internet gratuit Illimité”, ce qui en langage commercial ignorant signifie une partie du Web censurée et les ports de emails ouverts si vous nous achetez un maxi best of.

Donc pas de SSH.

Heurement Github est grand, Github est beau, et Github accepte les push via HTTPS.

Modifiez juste une ligne dans votre fichier .git/config de :

[remote "origin"]
	url = git@github.com/votre_pseudo/votre_repo.git

Vers :

[remote "origin"]
	url = https://github.com/votre_pseudo/votre_repo.git

La commande git devrait vous prompter pour username (mettez votre email) et mot de passe, et hop : le monde du télétravail à la campagne s’ouvre à vous.

flattr this!

]]>
http://sametmax.com/git-push-via-http-ou-comment-travailler-au-macdo/feed/ 17
Le fichier .gitkeep http://sametmax.com/le-fichier-gitkeep/ http://sametmax.com/le-fichier-gitkeep/#comments Sat, 20 Jul 2013 06:34:32 +0000 Sam http://sametmax.com/?p=6731 .gitkeep.]]> On ne peut pas commiter les dossiers vides avec git, si il n’y a pas de fichier dedans, git ignorera le dossier. Parfois, quand on veut partager une arborescence très précise, c’est handicapant. Il s’est donc créé une convention dans la communauté : le fichier .gitkeep.

C’est un fichier vide, nommé, comme vous pouvez l’imaginer, .gitkeep, et que l’on met dans chaque dossier que l’on veut garder. On ajouter le fichier à l’index, et on commit. Dès que le dossier n’est plus vide, on supprime le fichier .gitkeep, et on le commit.

Cependant on veut parfois garder un dossier vide, et qu’il n’y ait jamais de fichier dedans, comme par exemple le dossier /static/ de Django si vous distribuez un software à base de ce framework, puisqu’il doit servir à vos utilisateurs pour y mettre leurs fichiers statiques plus tard. Il serait donc embêtant de mettre un fichier dedans par erreur et le commiter.

Pour éviter cela, il suffit de créer un fichier .gitignore dedans, et de lui donner ces règles :

*           # git ignore tous les fichiers
!.gitignore # sauf celui-ci

Ce qui aura pour effet d’interdire le moindre ajout de fichier du dossier en question dans Git, à part le .gitignore, évidement.

flattr this!

]]>
http://sametmax.com/le-fichier-gitkeep/feed/ 2
Github comme hébergeur gratuit de fichiers http://sametmax.com/github-comme-hebergeur-gratuit-de-fichiers/ http://sametmax.com/github-comme-hebergeur-gratuit-de-fichiers/#comments Tue, 25 Jun 2013 20:35:19 +0000 Sam http://sametmax.com/?p=6445 J’inaugure une nouvelle technique de feignasse : copier / coller les mails que je réponds à un lecteur, tel quel.

Ici on me demandais (je crois ^^) comment faire pour donner un lien de téléchargement d’un code sous Gitub. Voici l’info, si ça vous intéresse.

Sur github, tu peux sans problème donner un zip à télécharger, tant que
ton repository est publique.

Par exemple, notre lib batbelt est à l’URL github :

https://github.com/sametmax/Bat-belt/

Il suffit de rajouter :

archive/master.zip

Et c’est téléchargeable :

https://github.com/sametmax/Bat-belt/archive/master.zip

En plus ce sera toujours la dernière version. Ca marche pour toutes les
branches et tous les tags, mais aussi n’importe quel commit :

https://github.com/sametmax/Bat-belt/archive/96ca096bb9eead0675186b36c576251935e96cf9.zip

Pour avoir un fichier en particulier, il faut prendre l’URL du fichier,
et la préfixer de “raw” et retirer “blob”. Par exemple, le fichier :

https://github.com/sametmax/Bat-belt/blob/master/batbelt/structs.py

Est téléchargeable à :

https://raw.github.com/sametmax/Bat-belt/master/batbelt/structs.py

Là le fichier est accessible directement, et téléchargeable avec Ctrl + S.

@+

Alala, qu’est-ce que ne ferais pas un blogger pour ajouter du contenu à son blog en en branlant le moins possible ?

flattr this!

]]>
http://sametmax.com/github-comme-hebergeur-gratuit-de-fichiers/feed/ 8
Forcer une identity SSH pour un host en particulier http://sametmax.com/forcer-une-identity-ssh-pour-un-host-en-particulier/ http://sametmax.com/forcer-une-identity-ssh-pour-un-host-en-particulier/#comments Fri, 24 May 2013 10:25:45 +0000 Sam http://sametmax.com/?p=6211 Vous avez accumulé un certain nombre de clés SSH, et pour certains serveur ou certains sites Web (github, bitbucket…), vous voulez utiliser une clé SSH et pas une autre. Ce serait en effet dommage de pusher votre commit Git avec la mauvaise identité.

Sous unix, le fichier ~/.ssh/config est votre ami, rajoutez lui :

Host Un alias pour l'host
HostName Une IP ou un nom de domaine pour l'host
User votre nom d'utilisateur
IdentityFile le fichier de clé public à utiliser

Par exemple :

Host bitbucket.org
HostName bitbucket.org
User sam
IdentityFile ~/.ssh/sam.pub

Host local-dev
HostName 192.169.0.10
User dev
IdentityFile ~/.ssh/local-dev.pub

On peut créer plusieurs Host pour le même hostname, avec des résultats intéressant quand on a plusieurs identités en ligne.

flattr this!

]]>
http://sametmax.com/forcer-une-identity-ssh-pour-un-host-en-particulier/feed/ 6
Récupérer une branche supprimée sous Git http://sametmax.com/recuperer-une-branche-supprimee-sous-git/ http://sametmax.com/recuperer-une-branche-supprimee-sous-git/#comments Wed, 27 Mar 2013 10:00:17 +0000 Sam http://sametmax.com/?p=2171 git branch -D nom_de_branche), pas de panique. Tant que le garbage collector n'est pas passé, la branche est toujours dans l'historique.]]> Vous avez supprimé une branche (avec git branch -D nom_de_branche), pas de panique. Tant que le garbage collector n’est pas passé, la branche est toujours dans l’historique.

Retrouvez le hash du dernier commit de la branche en vous baladant dans git reflog (quelques git checkout peuvent être nécessaires pour en voir le contenu). Si vous ne le trouvez pas dans le reflog, tentez git fsck --lost-found.

Une fois que vous avez le numéro magique, faites git branch nom_de_branche votre_hash, et vous voilà sorti d’affaire.

Non ne me remerciez pas, je ne fais que mon devoir madame.

flattr this!

]]>
http://sametmax.com/recuperer-une-branche-supprimee-sous-git/feed/ 4
Quelques commandes Git qu’elles sont bien http://sametmax.com/quelques-commandes-git-quelles-sont-biens/ http://sametmax.com/quelques-commandes-git-quelles-sont-biens/#comments Sat, 16 Feb 2013 12:40:48 +0000 Sam http://sametmax.com/?p=4529 Parce que quand y a plus de git, y en a encore.

Ajout interactif

Vous avez fait plusieurs modifications sur un fichier, mais vous voulez seulement en commiter une partie.

git add -p

Récupérer un fichier d’une autre branche

Vous avez une modif sur une autre branche, et vous voulez juste celle là.

git checkout-- checmin/vers/fichier

Ne jamais commiter les changements d’un fichier

C’est un peu un.gitignore, mais pour un fichier qui est déjà dans le repo. Cette commande demande à git d’ignorer toute modification d’un fichier, même si il est déjà suivi.

git update-index --assume-unchanged fichier

Créer une branche sans historique

Parceque fois, vous avez juste besoin de repartir à zéro, mais garder le même repo.

git checkout --orphan

Vérifier ce qu’on va commiter

Vous avez fait plein de add, mais vous voulez voir le diff de ce qui va être commité.

git diff --staged

flattr this!

]]>
http://sametmax.com/quelques-commandes-git-quelles-sont-biens/feed/ 2
Être alerté par Git quand un fichier a été modifié durant le dernier merge http://sametmax.com/etre-alerte-par-git-quand-un-fichier-a-ete-modifie-durant-le-dernier-merge/ http://sametmax.com/etre-alerte-par-git-quand-un-fichier-a-ete-modifie-durant-le-dernier-merge/#comments Mon, 28 Jan 2013 12:25:50 +0000 Sam http://sametmax.com/?p=4303 Il y a certains fichiers comme les migrations ou les fichiers de settings dont vous avez besoin de connaître l’état. Si un collègue les modifie et les push, vous voulez le savoir au moment du pull. Bien sûr vous pouvez scruter la liste des modifs à ce moment là, mais n’est-ce pas tellement mieux si votre ordinateur fait ça pour vous et affiche une grosse alerte rouge ?

Mettez le code suivant du le fichier .git/hooks/post-merge de votre repo en local :

#!/bin/bash
 
# On met ici tous les fichiers (ou pattern de nom) qu'on veut surveiller
# changez les pour les adapter à votre projet
files=('settings.py' 'migrations');
 
# on récupère tous les noms de fichiers modifiés depuis le dernier merge
modified_files=`git diff "HEAD@{1}" --name-only`
 
# on boucle sur chaque nom de fichier surveillé
for watched_file in "${files[@]}"; do
 
    # on liste tous les fichiers modifiés qui correspondent à ce nom de
    # fichier surveillé
    modified_watched_files=(`echo "$modified_files" | grep $watched_file`)
 
    # si le nombre de fichiers correspondant est plus grand que 0
    if [ ${#modified_watched_files[@]} ]; then
 
        # pour chaque fichier qui correspond, on affiche un avertissement
        # en rouge
        for modified_watched_file in "${modified_watched_files[@]}"; do
 
            echo -e "\e[41m "$modified_watched_file" has changed \033[0m"
 
        done
 
 
    fi
 
done

Le hook post-merge est exécute après git pull (et seulement si il n’y a pas eu de conflit). Il va afficher une bonne grosse alerte en rouge pour chaque fichier surveillé qui a été modifié entre avant et après le pull.

Notez au passage la syntaxe intuitive de bash pour utiliser des tableaux. On dirait presque que le mec qui a codé bash était un pote du gars qui a codé git.

flattr this!

]]>
http://sametmax.com/etre-alerte-par-git-quand-un-fichier-a-ete-modifie-durant-le-dernier-merge/feed/ 1
Git next et Git prev, pour vos tutos http://sametmax.com/git-next-et-git-prev-pour-vos-tutos/ http://sametmax.com/git-next-et-git-prev-pour-vos-tutos/#comments Wed, 23 Jan 2013 08:59:23 +0000 Sam http://sametmax.com/?p=4241 Il peut être pratique de fournir un repository Git plein de code à télécharger dans un tuto. Parfois le code a plusieurs états, comme autant d’étapes que vous voulez que le lecteur découvre au fur et à mesure.

Voici un petit alias Git qui permet de faire exactement cela. Mettez dans votre fichier ~/.gitconfig :

[alias]
    prev = checkout HEAD^1
    next = "!sh -c 'git log --reverse --pretty=%H master | awk \"/$(git rev-parse HEAD)/{getline;print}\" | xargs git checkout'"

Et votre lecteur pourra juste faire :

git next
git prev

Pour passer au commit suivant ou précédent dans votre repo, comme un wizard. Vous pouvez alors dans votre tuto parler du code dans un état donné, puis lui demander de faire git next, puis parler du nouvel état du code, etc.

flattr this!

]]>
http://sametmax.com/git-next-et-git-prev-pour-vos-tutos/feed/ 16
A l’intérieur de mon .bashrc http://sametmax.com/a-linterieur-de-mon-bashrc/ http://sametmax.com/a-linterieur-de-mon-bashrc/#comments Tue, 22 Jan 2013 10:26:44 +0000 Sam http://sametmax.com/?p=4238 .bashrc donne rapidement lieu dans les comments à un concours de celui qui a la plus longue (jusqu'à ce qu'arrive un utilisateur de zsh, et alors commence le concours de celui qui pisse le plus loin). Mais bon, aujourd'hui j'ai la flemme d'écrire un article complet.]]> Généralement montrer son .bashrc donne rapidement lieu dans les comments à un concours de celui qui a la plus longue (jusqu’à ce qu’arrive un utilisateur de zsh, et alors commence le concours de celui qui pisse le plus loin). Mais bon, aujourd’hui j’ai la flemme d’écrire un article complet.

Rappel : le .bashrc c’est le fichier qui est automatiquement chargé au démarrage du shell bash, le shell par défaut sur la plupart des Unix incluant Mac et Ubuntu.

Donc si vous voulez avoir une expérience de travail personnalisée dans votre terminal, c’est dans ce fichier que ça se passe.

Personnellement, j’ai tout le bordel que met Ubuntu par défaut (notamment les trucs avec les autocomplétions de partout). En en prime je rajoute :

# un raccourcis pour lancer redis car je le met sur off par défaut met je le 
# lance souvent
 
function redis {
    if [ ! -e "/var/run/redis/redis-server.pid" ] ; then
        sudo service redis-server start
    fi
}
 
# un tas de raccourcis type
 
function projet_django {
    workon projet_django;
    cd /home/sam/Work/projet_django/repo/projet_django;
 
    if [[ $# -ne 0 ]]; then
        ./manage.py $@
    fi
}
alias sb='projet_django'
 
# CF: http://sametmax.com/un-alias-bash-pour-django-virtualenv-dont-je-ne-peux-plus-me-passer/
 
 
# fonction fétiche de bourrin
 
function killbill {
    BAK=$IFS
    IFS=$'\n'
    for id in $(ps aux | grep -P -i $1 | grep -v "grep" | awk '{printf $2" "; for (i=11; i<NF; i++) printf $i" "; print $NF}'); do 
        service=$(echo $id | cut -d " " -f 1)
        if [[ $2 == "-t" ]]; then
            echo $service \"$(echo $id | cut -d " " -f 2-)\" "would be killed"
        else
 
            echo $service \"$(echo $id | cut -d " " -f 2-)\" "killed"
            kill -9 $service
        fi
    done
    IFS=$BAK
}
 
# que j'ai un peu amélioré depuis http://sametmax.com/tu-vas-crever-oui/
 
 
# une fonction pour commiter rapidement 
function commit {
    git commit -m "`echo "$*" | sed -e 's/^./\U&\E/g'`"
}
alias co=commit;
 
# en gros on tappe "co message de commit". Sans guillement, sans rien.
 
# des completions pour manage.py et git
 
source /home/sam/.django_bash_completion
source /home/sam/.git-completion.bash
 
# activation du cache de pip pour éviter de télécharger 20 fois la même lib
 
PIP_DOWNLOAD_CACHE='/opt/pip-cache';
export PIP_DOWNLOAD_CACHE;
 
# un super outil pour un git plus user friendly
 
[ -s "/home/sam/.scm_breeze/scm_breeze.sh" ] && source "/home/sam/.scm_breeze/scm_breeze.sh"
alias c="git_index"
 
# j'en avais parlé ici : http://sametmax.com/scm-breeze-facilite-la-selection-de-vos-fichiers-a-commiter-sous-git-avec/
 
 
# un prompt personalisé tout en couleur
# formaté comme ça: [nom du virtualenv] sam ~/path (branche git) $
 
source ~/.prompt.bash
 
# le fichier ressemble à ça : http://0bin.net/paste/d103a91dc41818462da0c8468ddddf4141f2efd6#dKr6qWHfAVZsSnOQ7fA4pPQ3Dquhz0Oj1b2OF8xw6vA=
 
# la configuration de virtualenv wrapper 
export WORKON_HOME=/home/sam/.virtualenvs
mkdir -p $WORKON_HOME
source /usr/local/bin/virtualenvwrapper.sh
 
# plus de détails ici : http://sametmax.com/les-environnement-virtuels-python-virtualenv-et-virtualenvwrapper/
 
 
# j'ai récément succombé aux sirène du virtualenv automatique
# j'avais beaucoup d'a priori (particulirement écraser la commande CD)
# mais à l'usage, c'est pratique
has_virtualenv() {
    if [ -e .venv ]; then
        workon `cat .venv`
    fi
}
venv_cd () {
    builtin cd "$@" && has_virtualenv
}
alias cd="venv_cd"
has_virtualenv
 
# en gros ça m'active un virtualenv si il y a un fichier .venv avec un nom
# de virtualenv dedans dans le dossier courrant
 
 
# je vous en parlais récement (http://sametmax.com/configurer-votre-terminal-pour-quil-vous-notifie-de-la-fin-dune-commande-longue/)
# c'est pour avoir une notifi à la fin des commandes longues 
notify_when_long_running_commands_finish_install
 
 
# ca c'est un truc de feignasse car je me souviens jamais comment extraire 
# en ligne de commande tel ou tel format
 
extract () {
    if [ -f $1 ]
    then
        case $1 in
            (*.7z) 7z x $1 ;;
            (*.lzma) unlzma $1 ;;
            (*.rar) unrar x $1 ;;
            (*.tar) tar xvf $1 ;;
            (*.tar.bz2) tar xvjf $1 ;;
            (*.bz2) bunzip2 $1 ;;
            (*.tar.gz) tar xvzf $1 ;;
            (*.gz) gunzip $1 ;;
            (*.tar.xz) tar Jxvf $1 ;;
            (*.xz) xz -d $1 ;;
            (*.tbz2) tar xvjf $1 ;;
            (*.tgz) tar xvzf $1 ;;
            (*.zip) unzip $1 ;;
            (*.Z) uncompress ;;
            (*) echo "don't know how to extract '$1'..." ;;
        esac
    else
        echo "Error: '$1' is not a valid file!"
        exit 0
    fi
}
 
# ça date de http://sametmax.com/decompresser-sous-linux-en-ligne-de-commande/
 
# et quelques alias pour des tâches de tous les jours
 
alias ..='cd ..'
alias ...='cd ../../'
alias ....='cd ../../../'
alias .....='cd ../../../../'
alias ......='cd ../../../../../'
 
alias process='ps aux | grep'
alias serve="python -c 'import SimpleHTTPServer; SimpleHTTPServer.test()'"

flattr this!

]]>
http://sametmax.com/a-linterieur-de-mon-bashrc/feed/ 20