¿Cómo clono una sola rama en Git?

800

Tengo un repositorio local de Git llamado 'esqueleto' que utilizo para almacenar esqueletos de proyectos. Tiene algunas sucursales, para diferentes tipos de proyectos:

casey@agave [~/Projects/skeleton] git branch
* master
  rails
  c
  c++

Si quiero consultar la rama maestra para un nuevo proyecto, puedo hacer

casey@agave [~/Projects] git clone skeleton new
Initialized empty Git repository in /Users/casey/Projects/new/.git/

y todo es como lo quiero. Específicamente, la nueva rama maestra apunta a la rama maestra esqueleto, y puedo presionar y tirar para mover los cambios a la configuración básica del proyecto.

Sin embargo, lo que no funciona es si quiero clonar otra rama. No puedo obtenerlo, de modo que solo extraigo la rama que quiero, por ejemplo, la railsrama, y ​​luego el nuevo repositorio tiene una masterrama que empuja y tira de la railsrama del repositorio de esqueleto , de forma predeterminada.

¿Hay una buena manera de hacer esto? O, tal vez esta no sea la forma en que Git quiere que yo estructurar las cosas, y ciertamente estoy abierto a eso. ¿Quizás debería tener múltiples repositorios, con el repositorio de esqueletos Ruby on Rails rastreando el repositorio de esqueletos maestro? Y cualquier proyecto individual que clone el repositorio de esqueletos de Ruby on Rails.

Casey Rodarmor
fuente
¿Qué git branch -amuestra?
Jakub Narębski el
3
¿ git checkout -b newbranch origin/branchiwantFuncionaría mejor? (sin la --trackopción)
VonC
3
Creo que lo que estás tratando de hacer allí es una mala idea. Utilice diferentes repositorios para diferentes proyectos. Las ramas son algo completamente diferente.
INNAM
@Manni, estaba pensando eso, ya que a git no parecía gustarle lo que estoy haciendo. ¿Puedes explicar porque? ¿Es porque las ramas no deberían durar mucho?
Casey Rodarmor
1
@rodarmor Creo que lo que está tratando de hacer allí es una buena idea, y tenía exactamente esta pregunta.
Paul Du Bois

Respuestas:

864

Nota: el git1.7.10 (abril de 2012) en realidad le permite clonar solo una rama :

# clone only the remote primary HEAD (default: origin/master)
git clone --single-branch

as in:
git clone <url> --branch <branch> --single-branch [<folder>]

Puedes verlo en t5500-fetch-pack.sh:

test_expect_success 'single branch clone' '
  git clone --single-branch "file://$(pwd)/." singlebranch
'

Tobu comenta que:

Esto está implícito cuando se hace un clon superficial.
Esto es git clone --depth 1la forma más fácil de ahorrar ancho de banda.

Y desde Git 1.9.0 (febrero de 2014), los clones superficiales admiten la transferencia de datos (push / pull), por lo que esa opción es aún más útil ahora.
Vea más en " ¿Es git clone --depth 1(clon superficial) más útil de lo que parece? ".


"Deshacer" un clon superficial se detalla en " Convertir clon superficial en clon completo " (git 1.8.3+)

# unshallow the current branch
git fetch --unshallow

# for getting back all the branches (see Peter Cordes' comment)
git config remote.origin.fetch refs/heads/*:refs/remotes/origin/*
git fetch --unshallow

Como Chris comenta:

La línea mágica para que las ramas que faltan se inviertan --single-branches (git v2.1.4):

git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git fetch --unshallow  

Con Git 2.26 (Q1 2020), " git clone --recurse-submodules --single-branch" ahora usa la misma opción de rama única al clonar los submódulos .

Ver commit 132f600 , commit 4731957 (21 de febrero de 2020) por Emily Shaffer ( nasamuffin) .
(Fusionada por Junio ​​C Hamano - gitster- en commit b22db26 , 05 mar 2020)

clone: pass --single-branch durante --recurse-submodules

Firmado por: Emily Shaffer
Acked: Jeff King

Anteriormente, realizando "git clone --recurse-submodules --single-branch " daba como resultado que los submódulos clonaran todas las ramas aunque el superproyecto clonara solo una rama.

Tubería a --single-branchtravés del marco auxiliar de submódulo para hacerlo ' clone' más adelante.

VonC
fuente
80
git clone <url> --branch <branch> --single-branch <folder>Funciona de maravilla.
Alexander
1
Sí, creo que es hora de actualizar la respuesta aceptada :) Esto "funciona como un encanto"
kumarharsh
55
Además, esto está implícito cuando se hace un clon superficial. Esta es clone --depth 1la forma más fácil de ahorrar ancho de banda.
Tobu
1
@Tobu y VonC --depth 1no son seguros para el usuario porque pueden desear realmente empujar / tirar con el nuevo clon.
RMN
2
Solo para explicar la corrección de Peter Cordes en su totalidad, la línea mágica para revertir las ramas que faltan --single-branches git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*y git fetch --unshallow(git v2.1.4)
Chris
670

Una forma es ejecutar lo siguiente.

git clone user@git-server:project_name.git -b branch_name /your/folder

Dónde branch_name está la rama de su elección y "/ su / carpeta" es la carpeta de destino para esa rama. Es cierto que esto traerá otras ramas que le darán la oportunidad de fusionarse de un lado a otro.

Actualizar

Ahora, comenzando con Git 1.7.10, ahora puedes hacer esto

git clone user@git-server:project_name.git -b branch_name --single-branch /your/folder
Alex Nolasco
fuente
36
Esto funciona, pero recupera todas las ramas. Ver la respuesta de @ frerich = raabe a continuación.
cdunn2001
3
Gracias. solo agrego "-b nombre_de_ rama" en mi caso. Me ahorró mucho tiempo.
PhatHV
Sí, funciona perfectamente ...! Soy más una persona de TFS y para mis proyectos personales he estado usando git. Wrto git bifurcación, lo estaba haciendo de la manera incorrecta antes y es bueno conocer este método fácil y parece perfecto. ¡Gracias de nuevo! Ya hice +1, si fuera posible le daría +100 :)
k25
11
También puede agregar --single-branchpara obtener solo el historial asociado con esta rama en lugar de todo el historial y las etiquetas que contiene el repositorio.
flawyte
1
@AlexNolasco ¿Puedes editar la respuesta diciendo qué es / some / folder ? Gracias
Nabin
112

Usando Git versión 1.7.3.1 (en Windows), esto es lo que hago ( $BRANCHes el nombre de la rama que quiero pagar y $REMOTE_REPOes la URL del repositorio remoto desde el que quiero clonar):

mkdir $BRANCH
cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout $BRANCH

La ventaja de este enfoque es que las llamadas git pull(o git fetch) posteriores también solo descargarán la rama solicitada.

Frerich Raabe
fuente
¿Cuál es la diferencia entre tu guión y esta línea? git clone -b $BRANCH $REMOTE_REPO $BRANCHafik son lo mismo?
Ian Vaughan
12
@ Ian: Una diferencia es que git clone -ble da todas las referencias remotas (todas las ramas y etiquetas remotas) como se git branch -amuestra. Con mi guión, solo obtienes una sola referencia.
Frerich Raabe
1
Cuando pruebo lo anterior (digamos con $ BRANCH = "nick"), me sale 'fatal: no pude encontrar refs remotas / heads / nick' No parece funcionar para mí ...
Nick
3
Tenga en cuenta que -t $BRANCHfunciona incluso sin -f, lo que se obtendría de inmediato. Luego, git fetch originbuscaría y git checkout $BRANCHestablecería la sucursal local y el pago. Eso es útil cuando necesita configurar el control remoto antes de ir a buscar, por ejemplo git config remote.origin.uploadpack=/bin/upload-pack.
cdunn2001
1
Como estoy en un "viejo" git corporativo (1.6.0.2) estoy obligado a la solución anterior. Tuve el mismo problema que @Nick. Ejecución de git branch -amostró origin/$BRANCH. Haciendo git checkout origin/$BRANCHesto arreglado.
dr jerry
30

Puedes probar el camino largo:

mkdir newrepo.git
cd newrepo.git
git init
git remote add origin file:///path/to/original
git fetch origin branchiwant:refs/remotes/origin/branchiwant
git checkout -b branchiwant --track origin/branchiwant

Lo que esto hace es:

  • Crea e inicia un repositorio Git vacío.
  • Agrega el repositorio original como un origen remoto llamado origen .
  • Obtiene solo la rama que necesita del origen remoto llamado .
  • Crea y extrae una nueva rama que está configurada para rastrear la rama fuente que acaba de clonar.

Esperemos que sea algo así como lo que buscas.

jkp
fuente
Los argumentos para git remote add se intercambian, pero no pude hacer que checkout funcione. "git checkout origin / rails" me dio "error: pathpec 'origin / rails' no coincidía con ningún archivo conocido por git". y la alternativa me dio "fatal: git checkout: la actualización de rutas es incompatible con el cambio de ramas".
Casey Rodarmor
@rodarmor: he corregido el comando remoto de git, gracias. ¿Se puede pegar la salida de git branch -r?
jkp
@jkp, en realidad git branch -rno da salida.
Casey Rodarmor el
@rodarmor: he corregido el ejemplo y esto definitivamente funciona (probado). HTH (puede aceptarlo una vez que lo haya probado;))
jkp
El modificador -b es relativamente nuevo. La última vez que lo ejecuté en un debian squeeze no estaba disponible, IIRC
sehe
23

Puede hacerlo utilizando el siguiente comando:

git clone -b branch_name --single-branch project_url local_folder_to_clone_in
nosaiba darwish
fuente
2
Trabajado problema perfectamente, que en realidad tenía en el árbol de origen para clonar una sola rama, por lo tanto lo hizo de forma manual
azhar22k
17

Desde la página de manual de git-clone :

--single-branches tu amigo durante la clonación, recuerda usarlo --branch <branch name>o solo se clonará HEAD primaria remota (maestro por defecto)

Siempre recuerde hacer Ctrl+ F5para leer la fuente nueva, no la de la memoria caché :-) (no lo sabía, por mucho tiempo).

Casey
fuente
1
git clone <url> --branch <branch> --single-branch <folder>
shridutt kothari
17
git clone <url> --branch <branch> --single-branch

Simplemente ingrese la URL y el nombre de la sucursal.

Jitendra
fuente
8

Clonar solo una rama. Esta es la manera más fácil:

$ git clone -b BRANCH_NAME --single-branch [email protected]:___/PROJECTNAME.git
Cubiczx
fuente
3

Para clonar una rama de Git para la que no tiene la clave pública, use esto:

git clone -b <branch> <Git repository URL or clone URL you get from Git repository>
Prem S
fuente
2

Abre el cmd.

cd folder_name (ingrese la ruta donde clonar la rama)

Solo un comando:

git clone url_of_projecturltoclone -b branch_name
dhS
fuente
2

Un poco tarde pero quería agregar la solución que usé para resolver este problema. Encontré la solución aquí .

De todos modos, la pregunta parece ser: ¿cómo comenzar un nuevo proyecto desde una sucursal de otro repositorio?

Para esto, la solución que usé sería crear primero un nuevo repositorio en github o donde sea. Esto servirá como repositorio de su nuevo proyecto.

En su máquina local, navegue hasta el proyecto que tiene la rama que desea usar como plantilla para su nuevo proyecto.

Ejecute el comando:

git push https://github.com/accountname/new-repo.git +old_branch:master

Lo que esto hará es empujar el old_branch a new-repo y convertirlo en la rama maestra del nuevo repositorio.

A continuación, solo tiene que clonar el nuevo repositorio en el directorio local de su nuevo proyecto y comenzará un nuevo proyecto en la rama anterior.

Aaron Pennington
fuente
2

Tomemos el ejemplo del repositorio de frascos. Tiene 3 sucursales además de master. Vamos a pagar la rama remota 1.1.x

clonar el repositorio git

git clone https://github.com/pallets/flask

CD en el repositorio.

cd flask

buscar la rama remota 1.1.x

git fetch origin 1.1.x

pagar la sucursal

git checkout 1.1.x

Cambiará a la rama 1.1.xy rastreará la rama remota 1.1.x.

Chaitanya Vardhan
fuente
0

Similar a lo que @ nosaiba-darwish dijo aquí: aquí

Esto es lo que solemos hacer en nuestra empresa:

git clone -b <name_of_branch> --single-branch <git_url> folder_to_clone_locally

Aqeeb Imtiaz Harun
fuente
0

Si desea un clon superficial, puede hacerlo con:

git clone -b mybranch --depth=1 https://example.com/myproject.git localname

--depth=1implica --single-branch.

thakis
fuente
0

Hay principalmente 2 soluciones para esto:

  1. Debe especificar el nombre de la rama con el modificador de comando -b. Aquí está la sintaxis del comando para clonar la rama específica de git.

git clone -b <BRANCH_NAME> <GIT_REMOTE_URL>

Ejemplo: git clone -b tahir https://github.com/Repository/Project.git

El siguiente comando clonará la rama tahir del repositorio git. El comando anterior clona solo la rama específica pero obtiene los detalles de otras ramas. Puede ver todos los detalles de las ramas con el comando. git branch -a

  1. Puedes usar '--single-branch' para evitar obtener detalles de otras ramas como a continuación:

git clone -b <BRANCH_NAME> --single-branch <GIT_REMOTE_URL>

Ejemplo: git clone -b tahir --single-branch https://github.com/Repository/Project.git

Ahora si haces un git branch -a , solo mostrará su rama única actual que ha clonado y no todas las ramas, por lo que depende de usted cómo lo desee.

Espero que ayude a alguien algún día !! ...

Tahir77667
fuente
0

puede usar este comando para obtener una sola rama y cambiar el nombre de la carpeta si desea mantener una rama independiente

git clone -b [branch-name] --single-branch [url]  [folder_name]

ejemplo

git clone -b mybranch --single-branch git://github/repository.git  project_mybranch
Elbaz
fuente
-1

Se puede hacer en 2 pasos.

  1. Clonar el repositorio

    • git clone <http url>
  2. Echa un vistazo a la sucursal que deseas

    • git checkout $BranchName
Pramod Setlur
fuente