Ignorar arquivos gerados automaticamente pelo Emacs em um diff
Pergunta
Como faço diff
ignore arquivos temporários como foo.c~
?Existe um arquivo de configuração que fará com que ignorar os temporários seja o padrão?
De forma geral:qual é a melhor maneira de gerar um patch "limpo" em um tarball?Eu faço isso raramente (enviando uma correção de bug para um projeto OSS por e-mail) e sempre tenho dificuldade com isso ...
EDITAR:OK, a resposta curta é
diff -ruN -x *~ ...
Existe uma resposta melhor?Por exemplo, isso pode estar em um arquivo de configuração?
Solução
Isso não responde estritamente à sua pergunta, mas você pode evitar o problema configurando o Emacs para usar um diretório específico para manter os arquivos de backup.Existem diferentes implementações para Emacs ou XEmacs.
No GNU Emacs
(defvar user-temporary-file-directory (concat temporary-file-directory user-login-name "/")) (make-directory user-temporary-file-directory t) (setq backup-by-copying t) (setq backup-directory-alist `(("." . ,user-temporary-file-directory) (,tramp-file-name-regexp nil))) (setq auto-save-list-file-prefix (concat user-temporary-file-directory ".auto-saves-")) (setq auto-save-file-name-transforms `((".*" ,user-temporary-file-directory t)))
No XEmacs
(require 'auto-save) (require 'backup-dir) (defvar user-temporary-file-directory (concat (temp-directory) "/" (user-login-name))) (make-directory user-temporary-file-directory t) (setq backup-by-copying t) (setq auto-save-directory user-temporary-file-directory) (setq auto-save-list-file-prefix (concat user-temporary-file-directory ".auto-saves-")) (setq bkup-backup-directory-info `((t ,user-temporary-file-directory full-path)))
Você também pode removê-los todos com um simples comando find
find . -name “*~” -delete
Observe que o asterisco e o til estão entre aspas duplas para impedir que o shell os expanda.
A propósito, estes não são estritamente temporário arquivos.Eles são um backup da versão anterior do arquivo, para que você possa “desfazer” manualmente sua última edição a qualquer momento no futuro.
Outras dicas
Você pode criar um arquivo ignorado, assim:
core.*
*~
*.o
*.a
*.so
<more file patterns you want to skip>
e então corra diff
com -X
opção, assim:
diff -X ignore-file <other diff options you use/need> path1 path2
Costumava haver um arquivo .diffignore "próximo" ao kernel do Linux (talvez um arquivo informal), mas não consegui mais encontrá-lo.Normalmente você continua usando esse arquivo ignorado, apenas adicionando novos padrões que deseja ignorar.
Você pode criar uma pequena função/script para ele, como:
#!/bin/bash
olddir="/tmp/old"
newdir="/tmp/new"
pushd $newdir
for files in $(find . -name \*.c)
do
diff $olddir/$file $newdir/$file
done
popd
Esta é apenas uma maneira de criar um script.A maneira simples.Mas acho que você entendeu.
Outra sugestão é configurar no emacs um diretório de backup, para que seus arquivos de backup vão sempre para o mesmo lugar, fora do seu diretório de trabalho!
O autor da postagem listou isso como a 'resposta curta':
diff -ruN -x *~ ...
mas alimentar isso no shell fará com que * seja globbed antes que o diff seja invocado.
Isto é melhor:
diff -r -x '*~' dir1 dir2
Omito os sinalizadores -u e -N, pois são questões de gosto e não são relevantes para a questão em questão.