Me gustaría proteger mi repositorio git para que solo se puedan sobrescribir las ramas no maestras. ¿Hay alguna manera de proteger solo las ramas seleccionadas?¿Cómo puedo evitar que los impulsos no rápidos pasen a la (s) rama (s) seleccionada (s) en git?
Respuesta
Usted puede utilizar para configurar GitEnterprise por rama permisos (admin) para bloquear el avance rápido no empuja el uso de permiso de acceso de grano fino.
Y git config --system receive.denyNonFastForwards true
simplemente hará el trabajo si necesita bloquear el cambio de historial para todas las ramas.
This SO answer le dará lo que está buscando. Basta con modificar para aplicar a la rama principal en su lugar:
#!/bin/sh
# lock the master branch for pushing
refname="$1"
if [ "$refname" = "refs/heads/master" ]
then
echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
echo "You cannot push to the master branch."
echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
exit 1
fi
exit 0
Actualización:
Esto evitará que todo empuja a la rama principal, incluyendo el avance rápido.
Esto evitará que se presione la bifurcación seleccionada. Deben permitirse los empujes rápidos. –
[Aquí, alguien descubrió cómo detectar la fuerza forzada en las secuencias de comandos de actualización.] (Http://stackoverflow.com/a/12258773/444255) Explicación larga, el fragmento final aún debe ser hecho ... –
Puede evitar cambios no avance rápido mediante la configuración de denyNonFastForwards
git config --system receive.denyNonFastForwards true
pero se aplica para todas las ramas. Para más información por favor refiérase ProGit
Creo que depende de lo que use en el servidor para acceder a su repositorio. Hay algunas aplicaciones de servidor que admiten permisos por rama, como Gerrit o Gitlab (sin embargo, no estoy seguro si Gitlab admite su uso). Gerrit lo admite, ya que utilizo un flujo de trabajo similar en mi empresa.
Tal vez Gitolite también lo admite (eso es lo que Gitlab usa debajo del capó), que es más fácil de instalar, pero no tiene una interfaz web como Gerrit o Gitlab.
Comentario adicional: GitEnterprise, como se sugiere, también es una buena solución, sin embargo, mis sugerencias son adecuadas, si tiene su propio servidor (que es común en muchas compañías).
Aquí hay un gancho de actualización (copiar a ganchos/actualizar) que escribí para mi propio uso. Esta secuencia de comandos por defecto niega todas las actualizaciones que no avanzan rápido, pero les permite ramas configuradas explícitamente. Debería ser lo suficientemente fácil invertirlo para que las actualizaciones de avance rápido estén permitidas para todas las ramas excepto para la rama principal.
#!/bin/sh
#
# A hook script to block non-fast-forward updates for branches that haven't
# been explicitly configured to allow it. Based on update.sample.
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
#
# Config
# ------
# hooks.branch.<name>.allownonfastforward
# This boolean sets whether non-fast-forward updates will be allowed for
# branch <name>. By default they won't be.
# --- Command line
refname="$1"
oldrev="$2"
newrev="$3"
# --- Safety check
if [ -z "$GIT_DIR" ]; then
echo "Don't run this script from the command line." >&2
echo " (if you want, you could supply GIT_DIR then run" >&2
echo " $0 <ref> <oldrev> <newrev>)" >&2
exit 1
fi
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
echo "Usage: $0 <ref> <oldrev> <newrev>" >&2
exit 1
fi
# --- Check types
# if $newrev is 0000...0000, it's a commit to delete a ref.
zero="0000000000000000000000000000000000000000"
if [ "$newrev" = "$zero" ]; then
newrev_type=delete
else
newrev_type=$(git cat-file -t $newrev)
fi
case "$refname","$newrev_type" in
refs/tags/*,commit)
# un-annotated tag
;;
refs/tags/*,delete)
# delete tag
;;
refs/tags/*,tag)
# annotated tag
;;
refs/heads/*,commit)
# branch
# git rev-list doesn't print anything on fast-forward updates
if test $(git rev-list "$newrev".."$oldrev"); then
branch=${refname##refs/heads/}
nonfastforwardallowed=$(git config --bool hooks.branch."$branch".allownonfastforward)
if [ "$nonfastforwardallowed" != "true" ]; then
echo "hooks/update: Non-fast-forward updates are not allowed for branch $branch"
exit 1
fi
fi
;;
refs/heads/*,delete)
# delete branch
;;
refs/remotes/*,commit)
# tracking branch
;;
refs/remotes/*,delete)
# delete tracking branch
;;
*)
# Anything else (is there anything else?)
echo "hooks/update: Unknown type of update to ref $refname of type $newrev_type" >&2
exit 1
;;
esac
# --- Finished
exit 0
Sería útil si pudiera modificar la secuencia de comandos para que las actualizaciones sin avance rápido estén permitidas para todas las ramas excepto la principal – Ren
Si se le permite modificar su servidor, esto habilitará el reenvío rápido en el servidor.
ssh ip 'echo $"[receive]
denyDeletes = false
denyNonFastForwards = false" >> /path/to/repo/config'
#then git push -f origin master
- 1. Git merge -s theirs: ¿Simplemente?
- 2. En Perl, ¿cuál es la diferencia entre s/^ \ s + // y s/\ s + $ //?
- 3. ¿Cómo puedo calcular MB/s y MiB/s?
- 4. "git merge -s theirs" necesario, pero sé que no existe
- 5. Varios `con`s en` try`s
- 6. ¿Cómo obtener los campos privados de clase y su (s) clase (s) primaria (s) por reflexión?
- 7. decimal (s, p) o número (s, p)?
- 8. Excepción XML: carácter (s) inválido (s)
- 9. cuerdas s; &s+1; Legal? UB?
- 10. Sinónimo (s) múltiple (s) para los términos de búsqueda
- 11. jQuery para Cmd + s y Ctrl + s
- 12. ¿Fuente (s) recomendada (s) para mostrar los caracteres Unicode?
- 13. Recuperar mensajes de la (s) cola (s) de RabbitMQ
- 14. ¿Cómo puedo capturar COMMAND + S en jQuery?
- 15. ¿Cuál es la diferencia entre [\ s \ S] *? y. *?
- 16. Comprender la expresión regular [\ s \ S - [<>]] *
- 17. ¿Hay alguna (s) biblioteca (s) rápida (s) para encontrar ojos y boca humanos en Flash? (Actionscript)
- 18. ¿Lee la base de datos S-Plus sin S-Plus?
- 19. Combinador S en Erlang
- 20. '% s' % '' someString
- 21. error git "No se puede reescribir la rama (s) con un directorio de trabajo sucio"
- 22. Imprimiendo los 0's principales en C?
- 23. ¿Qué significa [\ S \ s] * en regex en PHP?
- 24. ¿Qué es sprintf_s analog de sprintf (newpath, "% s% s", ...)?
- 25. ¿Qué son los archivos .S?
- 26. ¿Por qué s ++ t no lleva a un desbordamiento de pila para s grande?
- 27. Cuando "" == s es falso pero "" .equals (s) es verdadero
- 28. Eliminar archivo (s) seleccionado (s) antes de cargarlo con Javascript
- 29. Expresión (s) válida (s) JSTL EL: javax.el.ELException: en Tomcat 7
- 30. que java (s) no solar puedo usar para ejecutar Clojure?
denyNonFastForwards no es la 'resolución' que deberías usar. Establezca un gancho git para denegar empujes de fuerza ... Esa es la forma correcta de hacerlo. – Eric
@Eric Denegar los empujes no rápidos es en realidad el camino a seguir en GitHub/BitBucket. No se inventaron nuevas bicicletas. –
Si niega todos los accesos no rápidos en cada rama, ¿cómo fusionaría sus ramas de características? – Eric