Baixar script executável do GitHub preservando as permissões + x

1

Eu quero fazer um repositório do GitHub de todos os scripts relevantes que eu postei aqui como respostas.

Mas, para simplificar o processo para os usuários, gostaria de fornecer um único comando para fazer o download do arquivo de script diretamente do repositório, sem ter que instalar git primeiro em git clone de todo o repositório.

Eu sei que posso usar wget para baixar um único arquivo, mas quando eu uso o link "Raw" de um arquivo (por exemplo, link ), o arquivo receberá o padrão umask permissions e, portanto, não terá bit de execução definido. Mas eu não quero que o usuário ainda tenha que executar chmod +x .

Os arquivos de script são enviados por push para o repositório com bits de execução corretos, eles também são preservados quando eu uso git clone para obter o repositório inteiro.

Qual é a maneira mais simples de recuperar (e às vezes executar automaticamente) um único arquivo do GitHub preservando sua permissão de execução sem ter que instalar o git e clonar todo o repositório?

    
por Byte Commander 05.03.2016 / 17:01

2 respostas

2

Obtenha os tarballs!

Mesmo que o Github não exponha isso no site (aparentemente anos atrás ), eles fornecem tar.gz arquivos dos repositórios.

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

<user> , <repo> , <filename> é o que você espera que eles sejam. --strip-components é usado para evitar que tar crie um diretório com o nome do repo.

Portanto:

$ 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

Não estou convencido de que este seja um caminho particularmente amigável. Um chmod +x adicional é IMO infinitamente preferível.

Tentativas com falha

Obtenha os zips!

Você pode processar a substituição no zsh para extrair os zips vinculados na página do repositório do Github. O Github, felizmente, adiciona metadados extras aos zips para que as permissões sejam preservadas. unzip no Ubuntu é capaz de usar isso para restaurar permissões. Então:

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

Infelizmente, =() é uma coisa ruim. Cria um arquivo adequado em vez de um FIFO. Bash não tem um equivalente. <() é sempre FIFO.

Git arquivos únicos

Você pode obter um um único arquivo do repo usando git . No entanto, o Github não suporta isso .

    
por muru 25.04.2016 / 03:11
2

Eu sugiro que você use gists em vez de um repositório git. Repositório por natureza é suposto ser uma coleção de arquivos. Gists, por outro lado, são arquivos únicos. Algo parecido com isto

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

Mas se você insistir em usar um repositório, em vez de um comando, combine 2 em 1. Lembre-se de que podemos especificar o interpretador para o código.

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

E é assim que funciona

$ 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.

Mesmo com 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)

Variação sobre o tema

Obtenha o URL do arquivo bruto clicando com o botão direito do mouse no botão raw no github

wget https://github.com/au-answers/dupe-check/raw/master/dupe-check
    
por Sergiy Kolodyazhnyy 25.04.2016 / 03:11