Aplicar automáticamente "git update-index--chmod=+ x" a los archivos ejecutables
executable file-permissions (5)
Aquí hay una secuencia de comandos para aplicar automáticamente "git update-index --chmod + x" a los archivos ejecutables:
for f in `find . -name ''*.sh'' -o -regex ''./s?bin/[^/]+'' -o -regex ''./usr/sbin/[^/]+'' -o -regex ''./usr/lib/[^/]+'' `;do
( cd `dirname $f` && git update-index --chmod=+x `basename $f` )
done
Con frecuencia agrego bash scripts a mi repositorio git, y los scripts tienen permisos ejecutables en el sistema de archivos linux antes de git add
. Pero después de enviar los archivos agregados a un repositorio remoto y arrastrarlos a otra ubicación, los archivos se muestran con permisos no ejecutables. Parece que hay dos formas de corregir el problema:
1. chmod u+x $script
git commit -am "fixing the script permissions... again..."
o
2. git update-index --chmod=+x $script
En lugar de arreglar los permisos cada vez, hay una manera de que git simplemente mire los permisos de archivo en el script durante git add
, reconozca que "hey, este es un archivo ejecutable". ¿Y agregarlo al repositorio con los permisos de ejecución directamente?
Hay varias maneras de hacer eso.
- Alias de Git
- Alias de Bash
- O incluso combinar bash y git alias
Alias de Git
Siempre puedes usar bash dentro de tu alias de git.
Abre tu configuración git:
vim ~/.gitconfig
Agregue una sección de alias (si no existe):
[alias] addscr = !sh -c ''if [[ ${0: -3} == ".sh" ]]; then git update-index --chmod=+x $0; git add $0''
Alias de Bash
Edita tu archivo de perfil de bash:
vim ~/.bashrc
Agregue esto al final del archivo:
function gitadd(){ if [[ ${1: -3} == ".sh" ]] then git update-index --chmod=+x $1 fi git add $1 } alias gitadd=''gitadd''
Combina git y bash alias
Edita tu archivo de perfil de bash:
vim ~/.bashrc
Agregue esto al final del archivo:
function checkShellFile(){ return ${1: -3} == ".sh" } alias gitadd=''checkShellFile ? git addsrcipt "$1" : && git add "$1"''
Edita tu archivo de configuración git:
vim ~/.gitconfig
Agregue una sección de alias (si no existe):
[alias] addscript = !sh -c ''git update-index --chmod=+x $0 && git add $0''
Ninguno de los anteriores ha sido probado
No creo que esto se pueda hacer con el comando git add
, pero es posible que pueda ejecutar un script justo después de ejecutar el comando git commit
, pero antes de que se cree realmente el commit.
Echa un vistazo al gancho de pre-commit.
http://git-scm.com/book/en/Customizing-Git-Git-Hooks
Básicamente, simplemente cree un archivo en su carpeta .git / hooks / llamado pre-commit. (Debería haber muestras ya en su carpeta de ganchos, cámbielas para eliminar ".sample" al final para activar una).
Hay un gotcha. Asegúrese de que su secuencia de comandos ejecute git stash -q
primero para que trabaje en las versiones reales de los archivos.
git 2.9.X / 2.10 (Q3 2016) trae chmod
a git add
same!
Ver commit 4e55ed3 (31 de mayo de 2016) por Edward Thomson ( ethomson
) .
Ayudado por: Johannes Schindelin ( dscho
) .
(Fusionada por Junio C Hamano - gitster
- in commit c8b080a , 06 jul 2016)
add
: agregar--chmod=+x
/--chmod=-x
opcionesEl bit ejecutable no se detectará (y, por lo tanto, no se establecerá) para las rutas en un repositorio con
core.filemode
configurado en falso, aunque los usuarios pueden desear agregar archivos como ejecutables para la compatibilidad con otros usuarios que sí tienencore.filemode
funcionalidad
Por ejemplo, los usuarios de Windows que agregan scripts de shell pueden desear agregarlos como ejecutables para la compatibilidad con los usuarios que no son de Windows.Aunque esto se puede hacer con un comando de plomería (
git update-index --add --chmod=+x foo
), enseñar el comandogit-add
permite a los usuarios configurar un archivo ejecutable con un comando con el que ya están familiarizados .
Puede ver el origen de esta nueva característica en " ¿Cómo crear permisos de modo de ejecución de archivos en Git en Windows? " (Febrero de 2011)
Una solución sin scripts de bash de lujo :
- Establezca
fileMode = true
en su archivo.git/config
(o ejecutandogit config core.filemode true
como otros lo han señalado) - Cambie el bit ejecutable en los permisos del archivo y confirme este cambio. (
chmod u+x $script
como usted señaló). Sólo tienes que hacerlo una vez. - Empuje hacia el control remoto
La próxima vez que salga de allí, git establecerá el bit ejecutable confirmado en el archivo. También tuve problemas similares, esto los resolvió.
fileMode = true
le dice a git que fileMode = true
lo único sobre los permisos que puede: el bit ejecutable. Esto significa que los cambios en el bit ejecutable serán reconocidos por git como cambios en el árbol de trabajo y esos cambios se almacenarán en el repositorio con su próxima confirmación.
Una vez que haya confirmado el bit ejecutable deseado, también puede restablecer su modo de fileMode
a false
para que la próxima vez git no lo moleste con dichos cambios cuando no quiera confirmarlos.