2012-03-19 14 views
15

Hemos estado tratando de obtener git-subtree trabajando en un proyecto (con la versión de Git 1.7.9.4) y nos hemos encontrado con una complicación. Otra persona anterior añadió el subárbol con este comando hace unos meses:git-subárbol complicaciones de extracción

git subtree add --prefix=foo [email protected]:foo.git master 

Ahora se han producido cambios sustanciales a foo y nos gustaría fusionar en esos cambios, lo ideal es aplastarlos en ninguno de los archivos han sido. modificado desde que fueron importados.

He intentado tres cosas para intentar fusionarme en los cambios.

Primero:

git subtree pull --squash -P foo [email protected]:foo.git master 

que arroja la excepción: Can't squash-merge: 'foo' was never added.

Segundo:

git subtree pull -P foo [email protected]:foo.git master 

esto funciona (más o menos), pero tiene el problema de tirar en todas las confirmaciones y tiene conflictos con los archivos que se han modificado.

Por último, he intentado esto:

git pull --squash -s subtree [email protected]:foo.git master 

Esto me da el resultado deseado, con la salida Automatic merge went well; stopped before committing as requested y todos los archivos a aparecer modificado (con el contenido correcto).

Idealmente, me gustaría seguir utilizando la primera versión git-subtree y obtener una salida cercana a la última versión. Si tenemos que usar la última versión de manera consistente en el futuro, lo haremos, pero estoy un poco confundido acerca de por qué el último no produce conflictos de fusión mientras que el del medio lo hace.

Cualquier ayuda es apreciada.

Respuesta

6

Tuve el mismo problema, y ​​en mi caso parece deberse a que la confirmación del subárbol inicial se combinó en la rama maestra.

Mirando a través de la fuente subárbol encontré esto: https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh#L224

Parece subárbol GREPS su registro de git para git-subtree-dir: foo pero no encuentra cometer un adecuado. Pruebe git log --grep="git-subtree-dir: foo/*\$", y si hay algo raro con esa confirmación, como ser un compromiso de fusión, ese podría ser el problema.

Simplemente trabajando sin aplastar funcionó para mí, aparte de los molestos conflictos de fusión. Lo hice en una sucursal temporal que luego git merge --squash edité en otra sucursal para evitar un historial desordenado. Podría haber sido rediseñado en su lugar también, por supuesto.

+1

Tuve el mismo problema que resultó haber sido causado por la pérdida de una subcarpeta en la opción de prefijo al intentar extraer. Agregar esto como un comentario ya que el mensaje de error no da ninguna indicación de este error y la solución de problemas me llevó aquí. –

+0

Gracias, esto es útil. Tuve un problema relacionado en el que moví el subdirectorio después de agregar el subárbol en él, lo que parece estropear este juego –

1

He estado experimentando el mismo error Can't squash-merge: 'foo' was never added. con sourcetree 1.7.0 cada vez que hago un pull en un subárbol. Sin embargo, creo que mi caso es diferente porque estoy usando subdirectorios.

SourceTree hace algo de la siguiente manera:
git -c diff.mnemonicprefix=false -c core.quotepath=false subtree pull -P dir1\subdir1 --squash remote-repo master

Y obviamente, si tuviéramos que intentarlo de nuevo en Git Bash (Git versión 2.6.1.windows.1), sería:
git subtree pull -P "dir1\subdir1" --squash remote-repo master

Sin embargo, eso falló. Lo siguiente también fracasó a pesar de la sintaxis del comando es fina:
git subtree pull -P dir1/subdir1 --squash remote-repo master

La solución que encontré para hacer que el trabajo es usar Git Bash con el siguiente comando:
git subtree pull -P "dir1/subdir" --squash remote-repo master

supongo que todavía hay algunos trabajo por hacer para el motor de procesamiento de línea de comando de Git.