Question

Je veux utiliser quelque chose comme la commande suivante pour créer une archive à déployer:

tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`

La commande inner git diff produit une liste de fichiers avec relative, y compris le chemin relatif, lorsque je l’exécute séparément.

Cependant, je rencontre deux problèmes: je dois pouvoir échapper automatiquement des espaces dans la sortie. Par conséquent, tar ne se plaint pas des fichiers contenant des espaces et lorsque le fichier tar est créé, tous les fichiers ont un duplicata 'fichier caché' précédé d'un '.' qui ne se présente pas avec ls -al . Ce sont des métafichiers spécifiques à OSX comme indiqué par kch.

Quoi qu'il en soit, est-ce que quelqu'un connaît la solution à ces problèmes, ou existe-t-il simplement un moyen plus simple de créer un script?

Était-ce utile?

La solution

Je me suis installé sur la solution suivante avec sed.

tar cjf ~/deploy.tar.bz2 \
`git diff --name-only 0abc 1def|sed -e "s/ /\\\ /g"`

Autres conseils

Les fichiers de points cachés sont-ils des fichiers de sous-traits de points?

Si pour le fichier foo , vous avez un autre ._ foo et que vous êtes sur Mac, le fichier point-underscore est l'emplacement où la ressource de fichier / métadonnées est conservée. .

En ce qui concerne la sortie git, vous pouvez essayer de la transférer via sed ou perl pour la citation. Je pense que xargs pourrait également aider ici.

Pourquoi ne pas utiliser l'option - files-from = FILE ou -T FILE de tar, où FILE peut être '-' pour indiquer l'entrée standard?

 git diff --name-only 0abc 1def | tar -T - cjf ~/deploy.tar.bz2

Vous ne devriez pas avoir de problème d'espaces ou de tabulations dans les noms de fichiers, ni de guillemets simples, ni de guillemets arrières, ni de barres obliques inverses (je pense que votre solution aurait des problèmes avec la guillemet simple "" dans le nom de fichier). Vous pourriez avoir un problème avec les nouvelles lignes dans les noms de fichiers, tout comme dans la solution IFS.

Si la taille importe peu, vous pouvez utiliser archive Git .

Je ne sais pas s'il est possible de créer une archive contenant uniquement les différences entre deux commits.

Vous pouvez essayer

eval tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def | while read x; do echo "'""$x""'"; done`

ou essayez la même chose en utilisant sed, ou

IFS='
' tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`

Notez qu’il n’ya qu’une seule nouvelle ligne dans IFS.

Cependant, si le nom de vos fichiers contient des nouvelles lignes, vous êtes condamné.

Voici une autre solution, plus élégante, qui évite les espaces d'échappement dans les noms de fichiers

git diff --name-only 0abc 1def | \
    tr '\n' '\0' | \
    xargs -0 tar -rjvf ~/deploy.tar.bz2

Comme l'a souligné jpalecek, on ne veut pas exécuter "tar -c ...". plusieurs fois, il vaut mieux utiliser -r.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top