2010-08-08 11 views
18

¿Hay alguna manera de clonar un repositorio que viene con subrepos, pero sin que Mercurial extraiga todos los subrepos?Mercurial `hg clone` pero ignorando todos los subrepos?

Parece que mientras que hg clone -U se puede utilizar para obtener un clon vacío de un repositorio, no hay nada que convenza a hg update para evitar el arranque tirando de todos los subrepos.

Debo señalar que es crucial mantener la capacidad de sincronizar fácilmente con la revisión de la cabeza después de crear dicho clon.

Respuesta

5

Esta respuesta puede añadir más de la cuestión es necesario, pero ofrece algunas notas valiosas en el trabajo con Mercurial cuando no se puede hacer para actualizar un mal camino o subrepository revisión.

Paso 1: Clonar el repositorio sin ninguna actualización

hg clone --noupdate source_repository destination_repository 

Paso 2: Uso revertir para obtener los archivos de la derecha

hg revert --all --rev revision_number --exclude subrepo_1 --exclude subrepo_2 ... 

En este punto, usted tiene un nuevo conjunto de cambios; Es posible que deba asegurarse de que la revisión principal sea correcta. Cuando hice esto, el padre de mi nuevo conjunto de cambios era el conjunto de cambios 0. Para solucionar esto, tuve que establecer el conjunto de cambios padre Y cambiar las ramas (ya que mi conjunto de cambios estaba en una rama diferente).

Paso 3: Cambiar el padre de la corriente cambia

hg debugsetparents revision_number 
hg branch branch_name 

Eso debería hacerlo.

+2

Después del paso 3, 'hg status' aún muestra todos los archivos como pendientes de agregar. Ejecutar 'hg debugrebuildstate -r tip' corrige eso. –

3

Si tiene un subrepo, un directorio de trabajo debe incluir alguna versión de ese subrepo. Esa versión puede ser una revisión anterior fija si se especifica, o la sugerencia si no es así.

No puede actualizar su repositorio sin obtener los subrepos; si tuvieras un directorio de trabajo completo sin ellos, no deberías estar usando subrepos; en su lugar, utiliza repositorios verdaderamente externos.

Si sus subrepos están vinculados con una determinada versión remota, las actualizaciones posteriores a la primera no desencadenarán una actualización del subrepo: ya están actualizados. Pero para la creación inicial del directorio de trabajo, tendrá que hacer una extracción remota.

Puede engañar a Mercurial cortando el archivo hgsubstate. Pero en realidad, su modelo y el modelo conceptual son diferentes, por lo que probablemente no sea una buena opción para subrepos si esto es una preocupación.

editar: Si se encuentra clonando y luego actualizando a la punta muchas veces, intente utilizar ramas locales o mq en su lugar. De esa manera solo tienes que hacer el clon inicial una vez.

+0

Parecen un buen partido la mayor parte del tiempo. Es solo que los subrepos son grandes, y la mejor manera de diferenciarme contra el "servidor" oficial que encontré es mantener un registro local limpio. Los subrepos agregan un montón de sobrecarga a este enfoque. –

+0

@romkyns: si solo desea realizar un seguimiento de lo que ha cambiado, use 'hg out' (o' hg diff' para los cambios no confirmados). O simplemente puedes crear el clon "limpio" una vez, y usar 'hg pull -u' ocasionalmente para mantenerlo actualizado ... – Borealid

+0

Gracias, supongo que tendré que tolerar un montón de copias extra de estos enormes subrepos. Encuentro 'hg diff' como no óptimo para revisar el código y usar diff externo basado en GUI. –

4

Encontré una manera hacky. Todavía requiere que todos los subrepos se revisen una vez, pero luego se pueden eliminar.

  1. Copie todo el lote, incluidos los subrepos. No hay forma de evitar esto.
  2. subrepos Eliminar
  3. hg remove .hgsub

me trataron de convencer a Mercurial hg remove .hgsub antes se clonan los subrepos, pero lo mejor que tengo es not removing .hgsub: file is untracked.

+6

Esto es una pena. –

+6

Esta solución realmente no ayuda si su subrepo externo es inaccesible por alguna razón. Alguna discusión sobre ignorar subrepos [aquí] (http://mercurial.selenic.com/bts/issue2520). –

13

Esto debería hacer lo que quiera:

REM Take a new clone, but do not update working directory 
hg clone --noupdate %REPO_PATH% %DESTINATION% 

REM Update working directory but exclude the certain subprojects 
hg revert --all --rev %BRANCH% --exclude %SUBREPO_PATH_1% --exclude %SUBREPO_PATH_2% 
Cuestiones relacionadas