¿Cómo usar Git para el control de fuente Unity3D?

499

¿Cuáles son las mejores prácticas para usar el control de fuente de Git con Unity 3D, particularmente al tratar con la naturaleza binaria de los proyectos de Unity 3D? Describa el flujo de trabajo, qué rutas se incluirían en .gitignore, qué configuraciones deben establecerse en Unity y / o el proyecto, y cualquier otra cosa especial que deba tenerse en cuenta.

Nota: Me doy cuenta de que usar Asset Server es la forma recomendada por Unity, pero me gustaría usar Git por varias razones. Por favor, no hay respuestas que indiquen o argumentan que debería usar el servidor de activos. El servidor de activos realmente no es una opción para mí.

PresionandoSiempre
fuente
3
"solo usa svn" independientemente de los argumentos inútiles de git V svn, git simplemente no es para archivos binarios grandes. Los proyectos de Unity son películas (y varios archivos binarios enormes, texturas, etc.), con un puñado de líneas de código. ¿usarías git para almacenar tu colección de películas? svn es al menos razonable.
Fattie
1
La solución más simple es simplemente excluir todas las carpetas binarias con gitignore, y solo usar git para sus archivos de código reales, y tal vez sus archivos de activos. ¿No es necesario incluir todos los archivos binarios ya que cada miembro del equipo puede compilarlos por sí mismos?
Kokodoko
@Kokodoko Los artistas no pueden compilar sus propios ejecutables.
Crashworks
Incluso si eso fuera cierto, aún pueden empujar nuevos recursos de imagen a git ... para que los desarrolladores pueden compilar con la nueva obra de arte ...
Kokodoko
@Kokodoko Eso significa que un artista tendría que esperar a que un desarrollador vea el commit y realice una compilación para ver sus cambios en el juego. Ese es un tiempo de iteración muy largo.
Crashworks

Respuestas:

523

Lo siguiente es un extracto de mi blog personal .

Usando Git con juegos 3D

Actualización de octubre de 2015: desde entonces, GitHub lanzó un complemento para Git llamado Git LFS que trata directamente con el siguiente problema. ¡Ahora puede versionar archivos binarios grandes de manera fácil y eficiente!

Git puede funcionar bien con juegos 3D listos para usar. Sin embargo, la advertencia principal aquí es que versionar archivos multimedia de gran tamaño (> 5 MB) puede ser un problema a largo plazo a medida que su historial de confirmación se hincha. Hemos resuelto este problema potencial en nuestros proyectos solo versionando el activo binario cuando se considera final. Nuestros artistas 3D usan Dropbox para trabajar en recursos WIP, tanto por la razón anterior como porque es mucho más rápido y simple (¡no muchos artistas querrán usar Git de forma activa!).

Flujo de trabajo de Git

Tu flujo de trabajo de Git es algo que debes decidir por ti mismo dadas tus propias experiencias como equipo y cómo trabajas juntos. Sin embargo. Recomiendo encarecidamente la metodología de Git Flow apropiadamente nombrada como la describe el autor original aquí .

No entraré en demasiada profundidad aquí sobre cómo funciona la metodología, ya que el autor la describe perfectamente y en pocas palabras, por lo que es fácil de entender. He estado usando con mi equipo por un tiempo ahora, y es el mejor flujo de trabajo que hemos probado hasta ahora.

Aplicación de cliente Git GUI

Esto es realmente una preferencia personal aquí, ya que hay bastantes opciones en términos de Git GUI o si se debe usar una GUI. Pero me gustaría sugerir la aplicación gratuita SourceTree, ya que se conecta perfectamente con la extensión Git Flow. Lea el tutorial de SourceTree aquí sobre la implementación de la metodología Git Flow en su aplicación.

Unity3D ignora carpetas

Para una versión actualizada, Github mantuvo el archivo Unity.gitignore sin detalles del sistema operativo.

# =============== #
# Unity generated #
# =============== #
Temp/
Library/

# ===================================== #
# Visual Studio / MonoDevelop generated #
# ===================================== #
ExportedObj/
obj/
*.svd
*.userprefs
/*.csproj
*.pidb
*.suo
/*.sln
*.user
*.unityproj
*.booproj

# ============ #
# OS generated #
# ============ #
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

Configuración de Unity3D

Para versiones de Unity 3D v4.3 y posteriores:

  1. (Omita este paso en v4.5 y superior) Habilite la Externalopción en Unity → Preferences → Packages → Repository.
  2. Abre el Editmenú y selecciona Project Settings → Editor:
    1. Cambiar Version Control Modea Visible Meta Files.
    2. Cambiar Asset Serialization Modea Force Text.
  3. Guarde la escena y el proyecto desde el Filemenú.

¿Desea migrar su repositorio actual a LFS?

Mira mi publicación de blog para ver los pasos sobre cómo hacerlo aquí .

Configuracion adicional

Una de las pocas molestias principales que uno tiene al usar Git con proyectos de Unity3D es que a Git no le importan los directorios y felizmente dejará directorios vacíos después de eliminar archivos de ellos. Unity3D creará archivos * .meta para estos directorios y puede causar un poco de batalla entre los miembros del equipo cuando Git se compromete a seguir agregando y eliminando estos meta archivos.

Agregue este gancho posterior a la fusión de Git a la /.git/hooks/carpeta para repositorios con proyectos de Unity3D en ellos. Después de cualquier extracción / fusión de Git, verá qué archivos se han eliminado, verificará si el directorio en el que estaba está vacío y, de ser así, elimínelo.

S.Richmond
fuente
2
Mencionar sobre el flujo de trabajo de git es bueno, pero tal vez debería aclarar en mi pregunta que estoy preguntando sobre flujos de trabajo particularmente específicos para la unidad 3D. Como sabrán, los proyectos de la unidad dependen en gran medida de los archivos binarios. ¿Hay alguna consideración especial para lidiar con esto? Algunas de las recomendaciones que encontré al investigar este tema fueron usar un flujo de trabajo que evitara las fusiones tanto como fuera posible. Quizás no comparta este sentimiento, pero mi pregunta es más específica con respecto a cuestiones específicas de unity3d en lugar de las preferencias generales de flujo de trabajo.
PressingOnAlways
3
Utilizamos un git-annex para gestionar nuestro gran contenido binario. El soporte de Windows no es impresionante, pero está mejorando. Esto solo es útil si no le importa rastrear revoluciones en archivos binarios grandes.
Jerdak
2
Una actualización de esto: probamos su configuración y funcionó bastante bien, pero queríamos que nuestros activos se sincronizaran automáticamente. Ahora usamos sugarsync para sincronizar selectivamente la carpeta de activos binarios. Dropbox solo sincronizaría la carpeta de Dropbox, pero con la sincronización de Sugar, puede sincronizar arbitrariamente carpetas en cualquier parte del disco duro, lo cual es extremadamente útil. Tuvimos que cambiar un poco la estructura de nuestro directorio de Activos para definir una subcarpeta para estos archivos binarios grandes, pero hasta ahora ha funcionado muy bien. Simplemente .gitignore esa carpeta y permitimos que la sincronización de Sugar la mantenga sincronizada.
PressingOnAlways
2
¿Por qué elegir Hidden Meta Files?
Slipp D. Thompson
2
Se corrigió mi error tipográfico copiar y pegar: sí, deberían ser meta archivos visibles.
S.Richmond
60

En Unity 4.3 también tenía que habilitar la opción Externa desde las preferencias, pero desde Unity 4.5 descartaron la opción para eso, por lo que el proceso de configuración completo se ve así:

  1. Cambiar a Visible Meta FilesenEditor → Project Settings → Editor → Version Control Mode
  2. Cambiar a Force TextenEditor → Project Settings → Editor → Asset Serialization Mode
  3. Guardar escena y proyecto desde el Filemenú

Además, nuestro equipo está utilizando un .gitignorearchivo un poco más extendido :

# =============== #
# Unity generated #
# =============== #
Temp/
Library/

# ===================================== #
# Visual Studio / MonoDevelop generated #
# ===================================== #
ExportedObj/
obj/
*.svd
*.userprefs
/*.csproj
*.pidb
*.suo
/*.sln
*.user
*.unityproj
*.booproj

# ============ #
# OS generated #
# ============ #
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

Tenga en cuenta que las únicas carpetas que debe mantener bajo control de origen son Assetsy ProjectSettings.

Puede encontrar más información sobre cómo mantener Unity Project bajo control de fuente en esta publicación .

zasadnyy
fuente
Podría ser mejor si edita mi respuesta en la parte superior para incluir estas nuevas opciones. :)
S.Richmond
66
¿Por qué elegir Hidden Meta Files?
Slipp D. Thompson
El punto uno está claramente equivocado. No hay Unidad → Preferencias → Paquetes → Repositorio
Agostino
1
de acuerdo con docs.unity3d.com/Manual/… debe ser Meta Files visible
Markus
1
Funciona bien para mi equipo. Muchas gracias.
eifersucht 01 de
34

¿Qué es el GIT?

Git es un sistema de control de versiones distribuido (SCM) gratuito y de código abierto desarrollado por Linus Torvalds en 2005 (fundador del sistema operativo Linux). Está creado para controlar todo de proyectos pequeños a grandes con rapidez y eficiencia. Compañías líderes como Google, Facebook y Microsoft usan GIT todos los días.

Si desea obtener más información sobre GIT, consulte este tutorial rápido ,

En primer lugar, asegúrese de tener configurado su entorno Git. Debe configurar su entorno local y un repositorio Git (prefiero Github.com).

Aplicación cliente GIT Mac / Windows

Para la aplicación de cliente GIT gui te recomendé ir con Github.com,

GitHub es el lugar para compartir código con amigos, compañeros de trabajo, compañeros de clase y completos extraños. Más de cinco millones de personas usan GitHub para construir cosas increíbles juntos.

Configuraciones de Unity3d

Necesitas hacer esta configuración

Cambie a Meta archivos visibles en Edición → Configuración del proyecto → Editor → Modo de control de versiones.

ingrese la descripción de la imagen aquí

Habilite la opción externa en Unity → Preferencias → Paquetes → Repositorio

ingrese la descripción de la imagen aquí

Cambie a Forzar texto en Edición → Configuración del proyecto → Editor → Modo de serialización de activos.

ingrese la descripción de la imagen aquí

Fuente: Uso de Git con control de fuente de juegos 3D

NabeelSaleem
fuente
66
+1 Esta respuesta ya está escrita arriba, pero la respuesta de @NabeelSaleem me ayudó con las imágenes que proporcionó y una guía clara :) gracias
aflatoon
3
No puedo encontrar Preferences > Packagesen Unity 5.x Normal? ty
Yves Lange
55
@NabeelSaleem sí. En realidad, este paso en Unity 5.x no es necesario. ty
Yves Lange
22

Para agregar a todo lo indicado, también es ideal usar git lfs con Unity. He estado usando esto desde que salió y no tuve problemas con él.

Querrás agregar esto al .gitattributeslado de tu .gitignorearchivo

*.cs diff=csharp text
*.cginc text
*.shader text

*.mat merge=unityyamlmerge eol=lf
*.anim merge=unityyamlmerge eol=lf
*.unity merge=unityyamlmerge eol=lf
*.prefab merge=unityyamlmerge eol=lf
*.physicsMaterial2D merge=unityyamlmerge eol=lf
*.physicsMaterial merge=unityyamlmerge eol=lf
*.asset merge=unityyamlmerge eol=lf
*.meta merge=unityyamlmerge eol=lf
*.controller merge=unityyamlmerge eol=lf

*.a filter=lfs diff=lfs merge=lfs -text
*.mp3 filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.aif filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text
*.exr filter=lfs diff=lfs merge=lfs -text
*.fbx filter=lfs diff=lfs merge=lfs -text
*.FBX filter=lfs diff=lfs merge=lfs -text
*.rns filter=lfs diff=lfs merge=lfs -text
*.reason filter=lfs diff=lfs merge=lfs -text
*.lxo filter=lfs diff=lfs merge=lfs -text

Esa es mi lista de archivos rodantes. Si utiliza archivos binarios adicionales que no figuran en la lista, agréguelos.

También tengo archivos configurados para usar yamlmerge, deberías configurar esto. Puede leer sobre esto aquí: http://docs.unity3d.com/Manual/SmartMerge.html

rygo6
fuente
11

Ahora tenemos una integración perfecta a la unidad con la extensión Github to Unity ... https://unity.github.com/

La nueva extensión GitHub para Unity trae el flujo de trabajo de GitHub y más a Unity, brindando soporte para archivos grandes con Git LFS y bloqueo de archivos.

Al momento de escribir este proyecto, el proyecto está en alfa, pero aún se puede usar para proyectos personales.

Bhupen
fuente
intentaste esto?
Nabeel K
11

Pensé que podría publicar una más simple .gitignorepara cualquier persona interesada:

# Ignore Everything
/*

# Except for these:
!/.gitignore
!/Assets
!/Packages
!/ProjectSettings
Salir de mi césped
fuente
77
Nuevamente, todas estas respuestas están bastante desactualizadas en esta página. si por alguna razón tiene que usar git con Unity, github.com/github/gitignore/blob/master/Unity.gitignore
Fattie
Pequeño, simple y totalmente compatible con todas las versiones: creo que este script funciona mejor, incluso para Unity 2017 y 2018 que recientemente han cambiado la estructura de su proyecto ( UnityPackageManager/y Packages/).
Isaak Eriksson
8

Lo principal que debe recordar al usar git para el control de versión del código fuente de unity-3d:

(A) NO registre la carpeta Biblioteca . ¡He cometido este error varias veces en el pasado y he sufrido por ello! Elimine O mueva la carpeta de la biblioteca antes de agregar su proyecto / archivos a git.

(B) Use "Visible Meta Files" - para las últimas versiones de Unity - 5.3.4 y superiores, esto sucede de manera predeterminada. Para algunas de las versiones anteriores, debe cambiar la configuración en: Editar-> Configuración del proyecto-> Control de versiones

(C) Use un archivo .gitignore para Unity, para asegurarse de que se mantenga la cordura y que los archivos no se agreguen innecesariamente , si está en Android / tizen, agregue reglas para excluir los archivos APK y TPK del repositorio. Busque en Google un archivo .gitignore para la unidad O use este modelo .gitignore para Unity proporcionado por GitHub: https://github.com/github/gitignore/blob/master/Unity.gitignore

(D) Asegúrese de que el archivo .gitignore se agregue al repositorio como el primer archivo agregado, porque en el pasado personalmente he extrañado agregar el archivo .gitignore. Tengo muchas reflexiones en retrospectiva sobre por qué sucedió esto, pero hoy en día solo copio y agrego el archivo .gitignore como primer paso para configurar el repositorio.

Entonces ... para preparar un proyecto de Unity para git, haga lo siguiente:

(1) Ir a la carpeta del proyecto

(2) Escriba git init.

(3) Copie el archivo .gitignore: en MacOS: cp ~ / Downloads / .gitignore En Windows: copie c: \ Users [su nombre de usuario] \ Downloads.gitignore.

(4) git agregar .gitignore

(5) git add *

Espero que esto ayude ... ¡todo lo mejor!

Naligator
fuente
6

Edit -> Project Settings -> Editor

Establezca Control de versiones en meta archivos. Configure la serialización de activos para forzar el texto.

Creo que esto es lo que quieres.

afpro
fuente
1
Y luego, ¿cómo se configura la fusión YAML?
shinzou
6

Puede usar Github para Unity , una extensión de Unity que trae el flujo de trabajo de git a la interfaz de usuario de Unity.

Github for Unity acaba de lanzar la versión 1.0 de la extensión.

Kyle B
fuente
5

Solo las carpetas Assets y ProjectSettings deben estar bajo el control de versión de git.

Puedes hacer un gitignore como este.

[Ll]ibrary/
[Tt]emp/
[Oo]bj/

# Autogenerated VS/MD solution and project files
*.csproj
*.unityproj
*.sln
*.suo
*.userprefs

# Mac
.DS_Store
*.swp
*.swo

Thumbs.db
Thumbs.db.meta

.vs/
EllisonLee
fuente
3

Unity también proporciona su propio control de versión de origen. antes de unity5 era unityAsset Server pero ahora está depreciado. y lanzar un nuevo sistema de control SVN llamado unidad colaborar. pero el problema principal con la unidad y cualquier SVN es la escena de compromiso y fusión. pero Non of svn nos dan forma de resolver este tipo de conflictos o fusionar escena. así que depende de ti con qué SVN estás familiarizado. Estoy usando la herramienta SmartSVN en Mac. y tortuga en las ventanas.

ingrese la descripción de la imagen aquí

Shahbaz Ali
fuente
1

Solo agregando sobre el tema de Gitignore. La forma recomendada solo ignora Library y Temp, si está en la raíz de su proyecto git. Si eres como yo y a veces necesitas un proyecto de unidad para ser parte del repositorio, no todo el repositorio, las cadenas correctas en gitignore serían:

**/[Tt]emp
**/[Ll]ibrary
**/[Bb]uild
zambari
fuente
0

Quería agregar un flujo de trabajo muy simple de alguien que ha estado frustrado con git en el pasado. Hay varias formas de usar git, probablemente las más comunes para la unidad son GitHub Desktop, Git Bash y GitHub Unity

https://assetstore.unity.com/packages/tools/version-control/github-for-unity-118069 .

Esencialmente, todos hacen lo mismo, pero es la elección del usuario. Puede tener git para la configuración de archivos grandes que permite 1GB de almacenamiento de archivos grandes gratis con almacenamiento adicional disponible en paquetes de datos por $ 4 / mes por 50GB, y esto le permitirá enviar archivos> 100mb a repositorios remotos (almacena los archivos reales en un servidor y en su repositorio un puntero)

https://git-lfs.github.com/

Si no desea configurar lfs por cualquier razón, puede escanear sus proyectos en busca de archivos> 128 mb en Windows escribiendo size: large en el directorio donde tiene su proyecto. Esto puede ser útil para buscar archivos grandes, aunque puede haber algunos archivos entre 100mb y 128mb que se pierdan.

ingrese la descripción de la imagen aquí

El formato general de git bash es

git add. (agrega archivos para confirmar)

git commit -m 'mensaje' (confirma los archivos con un mensaje, todavía están en su PC y no en el repositorio remoto, básicamente han sido 'versionados' como una nueva confirmación)

git push (empujar archivos al repositorio)

La desventaja de git bash para proyectos de la unidad es que si hay un archivo> 100mb, no obtendrá un error hasta que presione. Luego debe deshacer su confirmación restableciendo su cabeza a la confirmación anterior. Una molestia, especialmente si eres nuevo con git bash.

La ventaja de GitHub Desktop es que ANTES de confirmar los archivos con 100mb, aparecerá un mensaje de error emergente. Luego puede reducir esos archivos o agregarlos a un archivo .gitignore.

Para usar un archivo .gitignore, cree un archivo llamado .gitignore en el directorio raíz del repositorio local. Simplemente agregue los archivos una línea a la vez que le gustaría omitir. SharedAssets y otros archivos de carpetas que no son de Asset generalmente se pueden omitir y se repoblarán automáticamente en el editor (los paquetes se pueden volver a importar, etc.). También puede usar comodines para excluir tipos de archivos.

Si otras personas están usando su repositorio de GitHub y desea clonar o extraer, también tiene esas opciones disponibles en el escritorio de GitHub o Git bash.

No mencioné mucho sobre el paquete Unity GitHub donde puedes usar GitHub en el editor porque personalmente no encontré la interfaz muy útil, y no creo que en general vaya a ayudar a nadie a familiarizarse con git, pero esto es solo mi preferencia.

vasmos
fuente