Posterior a investigar con expertos en la materia, programadores de deferentes ramas y profesores dimos con la solución al dilema y la compartimos en este post.
Solución:
Creo que casi lo lograste: attributes se puede leer desde varios lugares, con .gitattributes
siendo sólo los más comunes de ellos. La segunda, considerada una configuración por repositorio, es $GIT_DIR/info/attributes
.
Para citar el manual:
Tenga en cuenta que attributes se toman por defecto de la
.gitattributes
archivos en el árbol que se está archivando. Si desea modificar la forma en que se genera la salida después del hecho (por ejemplo, se comprometió sin agregar un
export-ignore
en su.gitattributes
), ajustar el desprotegido.gitattributes
archivar según sea necesario y utilizar--worktree-attributes
opción. Alternativamente, puede mantener lo necesario attributes que debería aplicarse al archivar cualquier árbol en su
$GIT_DIR/info/attributes
expediente.
Entonces, si es posible, pegue su lista a ese archivo y luego haga git archive
.
Otro enfoque es no usar git archive
pero en cambio simplemente tar
el árbol de trabajo pasando tar
la --exclude-from
opción de línea de comandos que acepta un archivo. Esto no funcionaría para un repositorio simple, pero si está de acuerdo con verificar cosas antes de archivarlas, esto se puede hacer haciendo git read-tree
y git checkout-index
suministrado con la correcta $GIT_INDEX_FILE
y $GIT_WORK_TREE
env. variables
Otra posible solución es invertir el enfoque: tar
(al menos GNU tar) admite una opción menos conocida de poder Eliminar cosas de un archivo en una canalización.
Básicamente, puedes hacer
$ tar -C a_path -c -f - .
| tar -f - --wildcards --delete '*.pdf' >result.tar
para que el primero tar
en la canalización archiva todo mientras que el segundo pasa todo excepto los archivos que coinciden con el *.pdf
patrón de globo de concha.
Entonces, si la especificación de archivos para eliminar usando globos de shell se puede ajustar al límite de la línea de comandos, simplemente canalice la salida de git archive
a un tar
proceso que elimina las cosas que no se necesitan.
Puede crear un archivo tar y luego eliminar carpetas y archivos que no es necesario que estén dentro
git archive HEAD -o archive.tar
tar -f archive.tar --delete listoffiles1
tar -f archive.tar --delete listoffiles2
tar -f archive.tar --delete listoffiles..
tar -f archive.tar --delete listoffilesN
de esta manera, puede dividir su línea de comando para permanecer por debajo de la longitud máxima del argumento cli
en lugar de poner export-ignore
en un (comprometido) .gitattributes
también puede ponerlo en un (no comprometido) $GIT_DIR/info/attributes
expediente. O alternativamente dejar el .gitattributes
no comprometido y usar el --worktree-attributes
opción, también probablemente no sea tan agradable ya que deja su árbol de trabajo sucio.