2011-05-17 16 views
34

Tengo algunos problemas con un repositorio de git que contiene varios submódulos.Subprogramas de Git y acceso ssh

El repositorio git súper se construyó con los comandos

mkdir projectname 
cd projectname 
git init 
git submodule add ssh://[email protected]/pathtorepos 

Cuando un usuario diferente ("otheruser") y luego clona el repositorio de todo súper parece funcionar. Pero cuando llega el momento de obtener el acceso al submódulo

git submodule init 
git submodule update 

git intenta clonar el submódulo usando "miusuario" en lugar de "otheruser".

¿Cómo solucionar este problema?

Respuesta

31

Si es posible, lo mejor es asegurarse de que el archivo .gitmodules contiene una URL del repositorio que se pueden clonar por cualquier persona, por lo general, ya sea una URL o git://http://. A continuación, los usuarios que tienen acceso SSH a sí mismos pueden cambiar en el submódulo después de la clonación y cambiar la dirección URL en remote.origin.url para que apunte a una dirección URL SSH con su nombre de usuario, por ejemplo:

cd my-submodule 
git remote set-url origin [email protected]:/pathtorepos 

El otro usuario debería ser capaz de hacer que incluso en la situación actual. Actualización: Chris Johnsen señala a continuación que también es razonable usar una URL SSH en .gitmodules si omite el nombre de usuario y todos los usuarios del repositorio tendrán acceso SSH; deberán agregar su nombre de usuario de manera similar a la anterior si difiere local y remotamente.

Tenga en cuenta que las URL en .gitmodules solo se usan cuando inicializa el submódulo. La inicialización del submódulo establece el valor de configuración submodule.<SUBMODULE-NAME>.url en el proyecto principal a lo que se haya comprometido en .gitmodules - este es el valor que se utilizará en la primera actualización del submódulo. Entre inicializar y actualizar el sub-módulo, también puede cambiar esta dirección URL que se utiliza para la primera actualización que con un comando como:

git config submodule.my-submodule.url [email protected]:/pathtorepos 

De hecho, es posible que tenga que hacer esto si la primera actualización falla. Una vez que el submódulo se ha actualizado por primera vez, la URL que necesita cambiar es la definida para origin dentro del submódulo; en ese punto, solo es útil establecer el valor de configuración submodule.my-submodule.url en el proyecto principal si es probable que esté eliminando y actualizando el submódulo.

+3

Es razonable usar URL basados ​​en SSH en '.gitmodules' ** si ** no incluyen un nombre de usuario (cada uno el usuario final puede configurar '.ssh/config' para proporcionar su propio nombre de usuario del servidor, si difiere de su nombre de usuario local). En segundo lugar, 'git submodule init' copia las entradas del submódulo de' .gitmodules' a '.git/config', por lo que hay un punto (después de' init', pero antes del primer uso de 'git submodule update'), donde puede reconfigurar la URL de un submódulo antes de que se haya clonado. Si los submódulos ya han sido clonados, su '(cd sub && git config remote.origin.url ...)' es (también) necesario. –

+0

@Chris Johnsen: He agregado una nota sobre su primer punto, gracias. Soy bastante consciente del último punto, pero he tratado de hacer un esfuerzo para mantener simples las respuestas en los submódulos, por lo que no todos se convierten en [publicaciones de blog rambling] (http://longair.net/blog)/2010/06/02/git-submodules-explained /) sobre todos los diferentes estados en los que pueden estar sus submódulos ... De todos modos, actualizaré esta respuesta para describir también esa situación :( –

+0

OK, espero que haya mejorado ahora. –

8

El otro usuario tiene que modificar el archivo .git/config para cambiar el nombre de usuario a su propio nombre de usuario. De esa forma, git usa el usuario correcto para conectarse al servidor.

[submodule "path/to/module"] 
    url = ssh://other[email protected]/pathtorepos 
2

Solo como referencia, la solución que terminé usando es la siguiente. En realidad, es posible que otros revisen el repositorio existente.

Cuando necesito descargar el repositorio se puede hacer con los comandos

git clone ssh://[email protected]/path/to/superrepos 
cd superrepos 
git submodule init 
git submodule update 

Para otros para descargar el repositorio estupendo, se utiliza el siguiente conjunto de comandos. La única diferencia es la clonación manual del otro repositorio

git clone ssh://[email protected]/path/to/superrepos 
cd superrepos 
git clone ssh://[email protected]/path/to/other/repos 
git submodule init 
git submodule update 

Tenga en cuenta que después de emitir el comando

git submodule init 

, Git le dirá que el depósito requerido y el disponible no es idéntico. Pero esto no es fatal y puedes continuar de manera segura.

+1

O, init, reconfigure, luego actualice: '...; cd superrepos; git submódulo init; git config submodule.name.url ssh: //[email protected]/path/to/other/repos; git submodule update '. –

0

No incluya el nombre de usuario en la URL. git pedirá el nombre de usuario y la contraseña al clonar/extraer/etc

1

Para resolver esto en un proyecto de código abierto, ingresamos una URL RELATIVA en el archivo .gitmodules. Esto hará que git clone la URL del submódulo en función de la URL que está siendo clonada por el patrón de URL del proyecto principal. Usando una ruta relativa cuidadosamente evita la especificación de protocolo (https, SSH) y nombre de usuario en su totalidad:

[submodule "my/tests/schemas"] 
    path = my/tests/schemas 
    url = ../my-schema 

P.S. después de la publicación me di cuenta de que mi respuesta es una tontería, aquí está la fuente que debe usar: Automatically access submodule via ssh or https