¿Hay alguna manera de decirle a git que solo incluya ciertos archivos en lugar de ignorar ciertos archivos?

165

Mis programas generalmente generan archivos de salida enormes (~ 1 GB) que no quiero hacer una copia de seguridad en el repositorio git. Entonces, en lugar de poder hacer

git add .

Tengo que hacer algo como

git add *.c *.cc *.f *.F *.C *.h *.cu

lo cual es un poco engorroso ...

Estoy bastante seguro de que podría escribir una secuencia de comandos Perl rápida en el contenido del directorio en .gitignore y luego eliminar archivos basados ​​en un archivo .gitinclude (o algún nombre similar), pero eso parece un poco hackear. ¿Hay una mejor manera?

Daisy Sophia Hollman
fuente

Respuestas:

231

No he tenido necesidad de probar esto yo mismo, pero de mi lectura de TFM parece que un patrón negado haría lo que usted desea. Puede anular entradas en .gitignore con entradas negadas posteriores. Por lo tanto, podría hacer algo como:

*.c
!frob_*.c
!custom.c

Hacer que ignore todos los archivos .c excepto custom.c y cualquier cosa que comience con "frob_"

TED
fuente
20
Gracias, TED Esto funcionó. Todo lo que tenía que hacer era iniciar el archivo .gitignore con * y luego enumerar todos mis patrones de archivo incluidos, seguidos de un signo de exclamación.
Daisy Sophia Hollman
8
¿Qué hay de las carpetas? No puedo encontrar una manera de incluir carpetas y archivos dentro negando una regla.
Marcio Cruz
44
Acerca de las carpetas, consulte stackoverflow.com/questions/12799855/…
uzsolt
2
muy agradable. Estoy usando esto para tener un repositorio en mi carpeta de inicio para cosas como vimrc y bashrc
Martin Capodici
1
@uzsolt no funciona si desea incluir una carpeta específica. ver stackoverflow.com/questions/987142/…
DiCaprio
73

cree el archivo .gitignore en su repositorio y desea rastrear solo los archivos c e ignorar todos los demás archivos y luego agregarle las siguientes líneas ...

*
!*.c

'*' ignorará todos los archivos

y! negará que los archivos sean ignorados ... así que aquí le pedimos a git que no ignore los archivos c ...

Vineel Kumar Reddy
fuente
¿También necesitas .*archivos ocultos?
trusktr
2
El *es un comodín incluso para ., por lo que los archivos ocultos también se ignoran, pero los archivos ocultos entonces todo lo que terminan en .cse incluyen.
Rohmer
2
Usando este método, creo que los archivos de las subcarpetas también se ignoran. Verifique esto para más detalles stackoverflow.com/a/11853075/739436
Stelian
1
Utilicé este método en mi directorio personal para rastrear solo mi .bashrc y .bash_history, por ejemplo, *seguido !.bash*en el archivo
.gitignore
1
Es posible que necesite *.*en Windows: vea la respuesta de @Smaranjit Maiti
Martin Capodici
13

La mejor solución para lograr esto

cree un .gitignorearchivo en el repositorio root, y si desea incluir solo un .carchivo, entonces debe agregar las líneas siguientes al .gitignorearchivo

*.*
!*.c

esto incluirá todos los .carchivos del directorio y subdirectorio de forma recursiva.

utilizando

*
!*.c

no funcionará en todas las versiones de git.

Probado en

git versión 2.12.2.windows.2

Smaranjit
fuente
2
Sí, tuve el mismo problema *y tuve que usarlo *.*. Esto está en Windows usando gitbash y git versión 2.9.0.windows.1
Martin Capodici
2

Si necesita ignorar archivos pero no un archivo específico dentro de un directorio, así es como lo hice:

# Ignore everything under "directory"
directory/*
# But don't ignore "another_directory"
!directory/another_directory
# But ignore everything under "another_directory"
directory/another_directory/*
# But don't ignore "file_to_be_staged.txt"
!directory/another_directory/file_to_be_staged.txt
gzfrancisco
fuente
0

Tarde para la fiesta, pero mi solución sería tener un directorio para los archivos de origen y un directorio diferente para los ejecutables y la salida del programa, algo como esto:

+ .git
|    (...)
+ bin
|    my_exe.exe
|    my_output.txt
+ src
     some_file.c
     some_file.h 

... y luego solo agrego las cosas src/a mi repositorio e ignoro por bin/completo.

Christian Severin
fuente