He estado escribiendo un script para agregar files sin seguimiento usando git add. El ciclo que uso en mi script es
for FILE in $(git ls-files -o --exclude-standard); do git add $FILE git commit -m "Added $FILE" git push origin master done
La secuencia de commands funciona bien hasta que se enfrenta a un nombre de file que tiene espacio en ella. por ejemplo, no puedo agregar el file Hello 22.mp4
. (Tenga en count que hay un espacio entre Hola y 22). El ciclo anterior tomaría el file como 2 files separados, Hello y 22.mp4 y saldrá con error. ¿Alguien sabe cómo agregarlo como un solo file?
Gracias
Lo que está sucediendo es que el shell está expandiendo $(...)
en un montón de palabras, y obviamente está interpretando un file con espacios embeddeds como files múltiples obviamente. Incluso con las sugerencias anteriores de citar el command git add
, no funcionaría . Entonces, el ciclo se ejecuta con arguments incorrectos, como se muestra en esta salida con set -x
:
ubuntu@up:~/test$ ls -1 aa ubuntu@up:~/test$ set -x; for FILE in $(git ls-files -o --exclude-standard); do git add "$FILE"; git commit -m "Added $FILE"; done + set -x ++ git ls-files -o --exclude-standard + for FILE in '$(git ls-files -o --exclude-standard)' + git add a ...
La solución adecuada es citar el git add $file
y tener git ls-files
NULL separar los nombres de file pasando -z
a git ls-files
y usar un ciclo while con un delimitador nulo:
git ls-files -o --exclude-standard -z | while read -r -d '' file; do git add "$file" git commit -m "Added $file" git push origin master done
Si está utilizando Bash alternativa a la solución provista por @AndrewF, puede utilizar la variable interna IFS bash para cambiar el delimitador de espacio a nueva línea, algo en estas líneas:
(IFS=$'\n' for FILE in $(git ls-files -o --exclude-standard); do git add $FILE git commit -m "Added $FILE" git push origin master done )
Esto es solo para tu información. La respuesta de AndrewF es más informativa que cubre la opción de debugging y el uso de while en lugar de for.
¡Espero que esto ayude!
Intenta poner la $FILE
entre comillas:
git add "$FILE"
Eso citará el nombre de file, permitiendo espacios en él.
Reemplazar git add $FILE
con git add "$FILE"
. De esa forma, se interpretará como un elemento único.
Sé que esto es muy tarde, pero esta es una forma de hacerlo utilizando el command xargs linux estándar:
git ls-files -o --exclude-standard | xargs -L 1 -I{} -d '\n' git add '{}'
Puedes probarlo simplemente repitiendo el command de la siguiente manera:
git ls-files -o --exclude-standard | xargs -L 1 -I{} -d '\n' echo "git add '{}'"
Para agregar como un único file, agregue una barra invertida antes del espacio en el nombre del file:
git agrega pathtofilename / filenamewith \ space.txt