git: annule les modifications spécifiques de la collection de postiers modifiée par programmation

Oct 30 2020

Je travaille avec des collections de postiers dans git. Postman fait beaucoup de choses bien, mais la régénération d'identifiant qui se produit lorsque vous importez n'est pas idéale.

L'importation d'une collection de facteur et son exportation à nouveau entraînent une modification pour chaque id

par exemple, sortie de git diff-index -p HEAD --

@@ -2404,7 +2412,7 @@
      {
        "listen": "test",
        "script": {
-           "id": "60ff37a6-9bf7-4cb4-b142-2da49ff4b86e",
+           "id": "38c15d28-8382-4eaf-ad17-f053c143212d",
            "exec": [
                "pm.test(\"Status code is 200\", function () {",
                "    pm.response.to.have.status(200);",

Je veux passer en revue les modifications dans le fichier et annuler toutes les modifications d'identifiant, mais conserver toutes les autres.

Essentiellement, je veux automatiser l'exécution de la git add -p {my_postman.collection.json}réponse nà chaque ligne avec un changement d'id.

Je peux voir cette commande Git pour ajouter par programme une plage de lignes d'un fichier à l'index? va dans le bon sens et Make git supprime automatiquement les espaces de fin avant de valider également

Réponses

1 LeGEC Oct 31 2020 at 00:03

Je suggérerais d'écrire un script, par exemple restore-existing-ids.sh, qui automatiserait la restauration des identifiants dans votre fichier sur le disque.

Ce serait plus simple à écrire qu'un programme qui doit simuler un va-et-vient interactif avec git,
et vous pouvez toujours l'utiliser dans un alias:

add-postman = '! f () { bash restore-existing-ids.sh "$1" && git add "$1"; }; f'

pour "nettoyer" un tel fichier avant de l'ajouter.

note : j'ai laissé entendre que ce script devrait être un bashscript, il peut évidemment être écrit dans n'importe quel langage (python, ruby, node ... tout ce qui fait flotter votre bateau)

JoSSte Nov 01 2020 at 00:29

C'est ma solution basée sur les suggestions de @LeGEC, mises ici pour les autres qui viennent à la recherche d'une solution réelle.


    #!/usr/bin/env bash
    
    # Check the command line argument value exists or not
    if [ $1 != "" ]; then if [ $1 == "--help" ]; then
    
            echo "Replaces UUIDs in *.postman_collection.json exported files with 00000000-0000-0000-0000-000000000000"
            exit 0
        else
    
            if [ "${1: -24}" == ".postman_collection.json" ]; then echo "Removing IDs from $1"
                # stat -c %y "$1" # show last modified time # format: 60ff37a6-9bf7-4cb4-b142-2da499f4b86e # 00000000-0000-0000-0000-000000000000 # 12345678-1234-1234-1234-123456789012 sed -i -r 's/"(_postman_id|id)": "([a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12})"/"\1": "00000000-0000-0000-0000-000000000000"/gm' "$1"
    
            else
    
                echo "Your file MUST end on .postman_collection.json or else it will not be parsed! \"$1\" is not valid"
                exit 1
    
            fi
    
        fi
    fi

L' .git/hooks/pre-commitinconvénient de cette approche est que les hooks ne font pas partie du référentiel. J'ai téléchargé ces scripts sur github

essayer de comprendre comment cela fonctionne en étudiant cette réponse: Comportement inattendu avec "git commit". lorsque le hook de pré-validation modifie les fichiers intermédiaires



#!/usr/bin/env bash

#get the changed files
files=`git diff --cached --name-status | awk '$1 != "D" { print $2 }'` #set changed flag to false CHANGED=false for filename in $files; do
    if [ "${filename: -24}" == ".postman_collection.json" ]; then sed -i -r 's/"(_postman_id|id)": "([a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12})"/"\1": "00000000-0000-0000-0000-000000000000"/gm' "$filename"
        git add $filename # mark changed flag true CHANGED=true fi done # if files have been changed (potentially) display a message and abort the commit if $CHANGED; then
    echo "PRE-COMMIT: Postman collection found. UUIDs have been sanitized. Please verify and recommit"
    exit 1
fi