2010-05-08 11 views
10

¿Hay alguna forma de enganchar cuando se produce un jaloneo en el control remoto (similar a una recepción previa o posterior a la recepción). Básicamente me gustaría poder hacer que el control remoto confirme lo que tenga cuando hay un tirón.¿Cómo engancho un git pull en el control remoto?

En mi situación, lo que está activo en el control remoto es una fuente autorizada que puede modificarse sin un commit de git. Quiero asegurarme de que cuando lo saco siempre pueda obtener lo último de lo que sea en vivo.

+1

Entonces, ¿está enviando una confirmación a un repositorio remoto y quiere que el repositorio remoto se comprometa justo antes de que sus cambios se fusionen en él? –

+0

No del todo. Más como este: 1: en el archivo remoto A.txt se edita 2: en local, ejecuto 'git pull remote' Lo que me gustaría es que edite file.txt para que se comprometa a que mi extracción derriba los cambios que se hicieron. – Danny

+0

¿Por qué no edita el archivo A.txt localmente, lo confirma y realiza la extracción en el servidor remoto? Los cambios deben comenzar en la configuración local del desarrollador y llegar hasta el entorno de producción, y no al revés. – Mathew

Respuesta

0

No tengo experiencia directa con ganchos git, y this page puede ayudar, pero parece que no va a poder hacerlo.

La solución más fácil (y mejor IMO) sería utilizar un repositorio distinto del entorno de producción como fuente autorizada. ¿Puedes hacer esto? Un entorno de producción se utiliza muy raramente como fuente autorizada porque las últimas y más estables son dos cosas muy diferentes ...

FYI, solo siempre realizan un git pull o estado de git cuando se encuentran en un entorno de producción. Cualquier cambio se realiza en mi repositorio local, se prueba, se compromete, se envía a github y luego se baja al entorno de producción.

ACTUALIZACIÓN
Debo señalar que una de las grandes fortalezas y características de Git es que se trata de un sistema de control de código fuente distribuido . Como tal, no existe realmente una fuente autorizada.

+0

Tal vez autoritario no era el término adecuado, más bien es una fuente de "pares" que es exactamente lo que promueve git. El único problema es que el par no puede comprometerse por sí mismo, así que estaba tratando de averiguar si los ganchos git pueden ayudarlo. – Danny

0

Creo que no se puede hacer esto con anzuelos, por lo que entiendo al leer el documento de los ganchos no hay ningún gancho que se ajuste a sus necesidades.

si necesito algo así como lo que usted quiere que crearía un script en 'remoto' que sale cada hora y comprueba si cualquier archivo estaba cambios (git status) y cometer todo (git commit -a -m "Confirmación automática").

+0

No es posible porque el control remoto es solo un recurso compartido de archivos almacenado en la nube. Sin embargo, gracias, me estoy dando cuenta de que esto no parece existir. Tengo los ganchos para cuando hago un empuje, no un tirón. Supongo que tendré que hacer algún tipo de commit + push vacío. – Danny

+0

Trate de encontrar la manera de montar localmente este almacenamiento de archivos para que pueda usar el comando de su computadora local git. Supongo que si pudiera acceder al almacenamiento en la nube como un almacenamiento local, podría hacer todo directamente desde su computadora. Si el almacenamiento en la nube es solo un simple almacenamiento que contiene sus archivos y pasa a tener el directorio .git dentro pero no ejecutar Git será imposible conectar algo allí. –

0

No es algo que nunca he hecho antes, pero se puede ejecutar scripts bash de php en el interior:

http://www.devx.com/opensource/Article/40785

que debería permitir que se comprometa y empujar un conjunto de cambios a través de una Script PHP Tira una interfaz sobre él o intégrelo en tu proceso de edición actual y deberías estar listo.

0

¿Quién/qué está editando este archivo? Si se cambia algo cuando alguien cambia algo en un sitio, debe ser activado por algo, lo que significa que puede automatizarlo. Cuando sucede algo y se guarda el archivo, allí debe desencadenar la confirmación. El compromiso debe hacerse en algún momento y podría ser en ese momento.

+0

Eso supone que el control remoto es realmente capaz de ejecutar un comando git. Pero en mi caso, es un servidor de archivos/instantánea en skydrive que quiero editar de la web en alguna ocasión. – Danny

3

Primero, para responder a su pregunta real: no hay ganchos invocados en el lado remoto cuando alguien busca. (Cuando alguien tira, todo el control remoto sepa es que cuales sacaron de ella - que no sabe si corrían git pull, git fetch, git remote update ...)

En cuanto a su situación real: Estoy de acuerdo con que Magnus' Lo mejor es que las confirmaciones se realicen después de las ediciones o, en su defecto, tener algún tipo de tarea periódica (cronjob?) que compruebe las modificaciones y confirma si encuentra alguna.Si no le gusta ninguna de estas opciones, le queda la simplificación de las cosas para que sea más rápido y fácil desencadenar una confirmación en el repositorio remoto justo antes de tirar.

Además, sugeriría no con respecto a un repositorio con un árbol de trabajo como su repositorio canónico. Te está pidiendo problemas si alguna vez necesitas presionar para ello. En su lugar, podría tener un repositorio canónico desnudo que su repositorio en vivo presiona después de la confirmación, e instalar un enlace posterior a la recepción en ese repositorio vacío para actualizar el repositorio activo cuando sea necesario.

+0

En cuanto a su último párrafo, eso no resuelve el problema en absoluto. Esto se puede hacer con gitolita, pero cuando alguien saca del repositorio desnudo, ¿cómo se hace para decirle al que no está desnudo que debe comprometer todo a menos que el usuario gitolite tenga privilegios directos para llamar a 'git commit', lo que no siempre es una buena idea . Básicamente, lo que mucha gente necesita es poder provocar un gancho en un repositorio remoto con un noop. Es por eso que la gente piensa que la búsqueda puede ser buena, solo para descubrir que no hay un gancho de búsqueda previa. Creo que podría resolverse presionando a una sucursal no existente ... – nus

+0

... Eso está bien para algo automatizado como la gitolita, pero es molesto si los humanos tenemos que recordar que antes de hacer una extracción ... – nus

1

Desafortunadamente, git no proporciona los ganchos de forma nativa para esto, ya que es un caso de uso perfecto para querer verificar algo antes de permitir una extracción/recuperación.

No sé si su 'remota' está en una máquina local, pero si no es así, echar un vistazo a gitolite que tiene ganchos que están diseñados precisamente para esto:

Desde el v2 gitolite docs:

"gl-pre-GIT" gancho

Aunque Git tiene un montón de ganchos agradables que puede aprovechar, todos corren sólo en un empujón. No hay nada que se ejecute en una búsqueda o clon, y no hay forma de ejecutar algo antes de que se invoque git-receive-pack o git-upload-pack (según sea el caso).

Para eso es el gancho gl-pre-git. Si hay un gancho ejecutable llamado gl-pre-git, se invocará con el directorio actual configurado para repo.git, y con un único argumento que será R o W dependiendo de lo que el cliente esté intentando hacer.

Para v3 gitolite, aquí están the docs about triggers. La documentación es un poco críptico, pero aquí es cómo funciona:

  1. en ~/.gitolite.rc añadir (en el ámbito global):

    PRE_GIT => [ '<pre_git_trigger_script_name>' ]

  2. en el mismo archivo mira la línea que permite establecer LOCAL_CODE y configúralo en donde quieras

  3. En el directorio que establezcas para LOCAL_CODE, crea un subdirectorio llamado 'triggers' y crea un script llamado <pre_git_trigger_script_name> con lo que quieras w hormiga que hacer en ese momento ... (asegúrese de hacer para: chmod +x <pre_git_trigger_script_name>

  4. plazo gitolite setup

  5. prueba & & tuvo un buen día

actualización: En realidad usando gitolite, Creo que podrías hacer que el disparador pregit haga algo así como presionar a una rama inexistente y luego enganchar para pre-recibir en tu repositorio no desnudo para rechazar el empuje, pero para hacer git add --all . && git commit -m"autocommit" && push gitolite en el p rocess Esto es útil cuando no desea permitir que los privilegios de usuario de alojamiento de gitolite ejecuten comandos directamente en su depósito no desnudo.

+0

"no hay forma de ejecuta algo antes de git-receive-pack o git-upload-pack "... excepto, por supuesto, solo por ponerles una interfaz ... es solo código. – jthill