¿Cómo puedo get solo el código fuente comprometido de Git?

Usando Git (ver 1.7), SourceTree (ver 1.5.1.0), y preferiblemente .NET (C #)

¿Cómo puedo get todo el código fuente comprometido de cometer C -> para comprometer G solamente? Nota: no quiero get la base de códigos completa, solo los files que se han confirmado.

Ejemplo de historial de compromiso

A -> B -> C -> D -> E -> F -> G -> H -> I

Intentar cambiar a Git, pero un requisito es que necesitamos un process automatizado para get el código fuente de nuestro process de publicación y documentation.

Utilizar

git diff-tree --name-only -r C~..G 

para get una list de todos los files modificados en el range de compromiso deseado (usando C~ ya que parece que desea include los cambios realizados en la confirmación C en lugar de los cambios en la list desde C), para cada file ejecute git show para git show su contenido en la último compromiso en el range.

 for f in $(git diff-tree --name-only -r C~..G) ; do git show G:$f ; done 

(Suponiendo un shell tipo Bourne. El equivalente es posible con cmd.exe si estás en Windows).

Para extraer los files en un tree de directorys por separado en lugar de simplemente tirarlos a la terminal, esto debería hacer:

 for f in $(git diff-tree --name-only -r C~..G) ; do mkdir -p DESTINATION/$(dirname $f) && git show G:$f > DESTINATION/$f done 

¿Qué tal el git format-patch C..G ? Eso le dará una list comstackda y diferida de todos los files que se cambiaron y los cambios realizados en cada uno, entre los dos commits. Dependiendo de su flujo de trabajo, puede iniciar el process de git desde C #, shell out, o posiblemente usar una de las librerías de git (no estoy seguro de si las C # tienen soporte para crear parches).

Los parches son bastante legibles por máquina y no son desagradables para los humanos, y pueden aplicarse a otra copy del código, incluidos en la documentation, extraídos para statistics generales o cualquier cantidad de otras cosas.

Creo que puede generar un solo parche, o uno para cada compromiso, dependiendo de qué tan detallado sea su process. Git también puede generar un correo electrónico con los cambios para enviarlos.

Gracias a Magnus y James Ehly obtuve lo que estaba buscando. Esto copyrá los files en un range de confirmaciones (C a G) en un file tar. Nota: esto solo obtendrá los files comprometidos. No todo el repository.

 git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT C~..G | xargs tar -rf myTarFile.tar 

Página del manual de git-diff-tree

-r -> recurse en subtreees

–no-commit-id -> git diff-tree genera una línea con el ID de confirmación cuando corresponda. Este indicador suprimió la salida de ID de confirmación.

–name-only -> Mostrar solo los nombres de los files modificados.

–diff-filter = ACMRT -> Seleccione solo estos files. Vea aquí para la list completa de files

C..G -> Archivos en este range de confirmaciones

C ~ -> Incluir files de Commit C. No solo files desde Commit C.

| xargs tar -rf myTarFile -> salidas a tar