web-dev-qa-db-fra.com

Téléchargez le script exécutable depuis GitHub en préservant + x autorisations

Je souhaite créer un référentiel GitHub contenant tous les scripts pertinents que j'ai postés ici en tant que réponses.

Mais pour que cela reste finalement simple pour les utilisateurs, je voudrais leur donner une seule commande pour télécharger directement le fichier de script à partir de mon référentiel, sans avoir à installer git d’abord sur git clone dans l’ensemble du référentiel.

Je sais que je peux utiliser wget pour télécharger un fichier unique, mais lorsque j'utilise le lien "Raw" d'un fichier (par exemple, https://github.com/AskUbuntu-Answers/dupe-check/ raw/master/dupe-check ), le fichier obtiendra les autorisations umask par défaut et n’a donc pas de bit d’exécution défini. Mais je ne veux pas que l'utilisateur doive toujours lancer chmod +x.

Les fichiers de script sont validés dans le référentiel avec les bits d’exécution corrects. Ils sont également conservés lorsque j’utilise git clone pour obtenir le référentiel complet.

Quel est le moyen le plus simple de récupérer (et parfois d'exécuter automatiquement) un seul fichier de GitHub en conservant son autorisation d'exécution sans avoir à installer git et à cloner l'intégralité du référentiel?

1
Byte Commander

Je suggérerais que vous utilisiez des gists au lieu d'un référentiel git. Le référentiel est par nature censé être une collection de fichiers. Les Gists, d’autre part, sont des fichiers uniques. Quelque chose comme ça

wget https://Gist.githubusercontent.com/SergKolo/d77dd46e9d936b5871e1829a2afd79c3/raw/726f39be5e0a939e06ed89239d2c350451b81316/get_unity_viewports.sh \
&& chmod +x ./get_unity_viewports.sh

Mais si vous insistez pour utiliser un référentiel, au lieu d'une commande, combinez 2 en 1. Rappelez-vous que nous pouvons spécifier un interpréteur pour le code.

curl https://raw.githubusercontent.com/au-answers/dupe-check/master/dupe-check  > dupe-check && python3 dupe-check

Et c'est comme ça que ça marche

$ curl https://raw.githubusercontent.com/au-answers/dupe-check/master/dupe-check\                                          
>   > dupe-check && python3 dupe-check
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7580  100  7580    0     0   6484      0  0:00:01  0:00:01 --:--:--  6489
Checked 1 files in total, 0 of them are duplicates by content.

Idem avec wget

$ wget https://raw.githubusercontent.com/au-answers/dupe-check/master/dupe-check && python3 dupe-check                     
--2016-04-24 21:17:35--  https://raw.githubusercontent.com/au-answers/dupe-check/master/dupe-check
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 23.235.44.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|23.235.44.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7580 (7.4K) [text/plain]
Saving to: ‘dupe-check.1’

100%[==================================================================================>] 7,580       --.-K/s   in 0s      

2016-04-24 21:17:36 (470 MB/s) - ‘dupe-check.1’ saved [7580/7580]

Checked 2 files in total, 2 of them are duplicates by content.
Here's a list of all duplicate files:

'dupe-check' (./dupe-check)
'dupe-check.1' (./dupe-check.1)

Variation sur le thème

Obtenez l'URL du fichier brut en faisant un clic droit sur le bouton raw dans github

wget https://github.com/au-answers/dupe-check/raw/master/dupe-check
2

Obtenez les tarballs!

Même si Github n'expose pas cela dans le site (apparemment ils l'ont fait il y a bien longtemps ), ils fournissent des fichiers tar.gz des référentiels.

wget -qO - https://github.com/<user>/repo>/archive/master.tar.gz | tar zx --strip-components=1 <repo>-master/<filename>

<user>, <repo>, <filename> sont ce que vous attendez d'eux. --strip-components est utilisé pour empêcher tar de créer un répertoire nommé d'après le référentiel.

Donc:

$ wget -O - https://github.com/au-answers/dupe-check/archive/master.tar.gz | tar zx --strip-components=1 dupe-check-master/dupe-check
--2016-04-25 08:28:50--  https://github.com/au-answers/dupe-check/archive/master.tar.gz
Resolving github.com (github.com)... 192.30.252.128
Connecting to github.com (github.com)|192.30.252.128|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/au-answers/dupe-check/tar.gz/master [following]
--2016-04-25 08:28:51--  https://codeload.github.com/au-answers/dupe-check/tar.gz/master
Resolving codeload.github.com (codeload.github.com)... 192.30.252.160
Connecting to codeload.github.com (codeload.github.com)|192.30.252.160|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2470 (2.4K) [application/x-gzip]
Saving to: ‘STDOUT’

-                                                           100%[========================================================================================================================================>]   2.41K  --.-KB/s    in 0s      

2016-04-25 08:28:52 (21.5 MB/s) - written to stdout [2470/2470]

$ ll dupe-check 
-rwxr-xr-x 1 muru muru 7.5K Mar  5 21:46 dupe-check

Je ne suis pas convaincu que ce soit une façon particulièrement amicale. Un chmod +x supplémentaire est IMO infiniment préférable.

Tentatives infructueuses

Obtenez les zips!

Vous pouvez traiter la substitution sur zsh pour extraire les zips liés sur la page de dépôt Github. Heureusement, Github ajoute des métadonnées supplémentaires aux zips afin que les autorisations soient préservées. unzip sur Ubuntu est capable de l'utiliser pour restaurer les autorisations. Alors:

unzip -j =(wget -O - https://github.com/au-answers/dupe-check/archive/master.Zip) dupe-check-master/dupe-check

Malheureusement, =() est une chose zsh. Il crée un fichier approprié au lieu d’une FIFO. Bash n'a pas d'équivalent. <() est toujours FIFO.

Git fichiers uniques

Vous pouvez obtenir n seul fichier du repo en utilisant git. Cependant, Github ne supporte pas cela .

2
muru