Como eu filtra uma lista de arquivos apenas para arquivos de texto?

3

Eu queria ter um comando git openlast que analisaria o último commit, obteria uma lista de arquivos adicionados ou alterados, os filtraria apenas para os arquivos de texto e, finalmente, os abriria em um editor.

Até agora eu fiz o seguinte:

git show --stat HEAD
read -p "Open in Vim tabs? (Y/n)" -n 1 -r
if [[ -z $REPLY || $REPLY =~ [Yy] ]]; then
  vim -p $(git diff --diff-filter=AM --ignore-submodules --name-only HEAD^)
fi

A queda é se eu adicionar ou alterar um arquivo binário no commit anterior, então ele será aberto pelo editor (Vim, neste caso). Existe uma maneira de obter a lista gerada pelo comando git diff e remover arquivos binários?

    
por Sukima 17.12.2015 / 23:05

2 respostas

4

Você pode canalizar para xargs e usar grep -Il "" para filtrar arquivos binários:

git diff --diff-filter=AM --ignore-submodules --name-only HEAD^ | \
  xargs grep -Il ""

Exemplo de comando git openfiles

#!/bin/bash
git show --stat HEAD
files=($(git diff --diff-filter=AM --ignore-submodules --name-only HEAD^ | xargs grep -Il ""))
read -p "Open ${#files[@]} files in Vim tabs? (Y/n)" -n 1 -r
if [[ -z $REPLY || $REPLY =~ [Yy] ]]; then
  exec vim -p ${files[@]}
else
  exit 1
fi
    
por 17.12.2015 / 23:35
1

Se você tiver extensões de arquivo, poderá usá-las com o Gawk para escolher o que deseja na lista. Exemplo tem extensões '.txt' e '.jpeg'. Expressão regular é usada para editar a saída do git.

git show --stat HEAD
commit ec07d8306e9e61894d18e6f8d6ea1e5d650c0712
Author: root <root@somebox>
Date:   Thu Dec 17 17:19:30 2015 -0500

test project commit

add email addresses.jpeg           | Bin 0 -> 127688 bytes
allpermissions.jpeg                | Bin 0 -> 126620 bytes
error.jpeg                         | Bin 0 -> 227469 bytes
sonic_boom.jpeg                    | Bin 0 -> 112958 bytes
test1.jpeg                         | Bin 0 -> 96857 bytes
test1.txt                          |   1 +
test2.txt                          |   1 +
top_cipher_test_results.jpeg       | Bin 0 -> 149293 bytes

Remoção de arquivos binários de extensão .jpeg pelo Gawk.

git show --stat HEAD|awk '{ if($1 ~ /.jpeg/)print $1}'

Inclusão do .txt e do .jpeg, se desejado:

git show --stat HEAD|awk '{ if($1 ~ /.jpeg|.txt/)print $1}'
    
por 17.12.2015 / 23:29

Tags