Pregunta

Recién estoy comenzando con git y tengo una pregunta. Mi aplicación tiene otros 10 desarrolladores trabajando en ella, cada uno con su propia rama como dev_XXXXX. Entonces, si hago un clon del repositorio, ¿se copia todo su código en mi máquina? En ese caso no quiero eso. Supongamos que mi rama es dev_swamy, ¿cómo puedo clonar solo la rama estable y dev_swamy? Gracias.

¿Fue útil?

Solución

Por defecto git clone buscaría todas las ramas, pero esas ramas se almacenarían como ramas de seguimiento remoto: por ejemplo, la rama 'dev_XXXXX' se almacenaría como 'origin / dev_XXXXX' (con 'refs / remotes / origin / dev_XXXXX 'como nombre completo). Esas ramas de seguimiento remoto no serían visibles en la salida git branch: necesitaría git branch -r para enumerar las ramas de seguimiento remoto (o git branch -a para enumerar todas las ramas). Si esas ramas no divergen demasiado de la línea principal, no ocuparían demasiado espacio en disco en el repositorio. Por lo tanto, no veo por qué desea clonar solo las ramas seleccionadas.

Sin embargo, si desea tener un clon con solo dos ramas seleccionadas, puede hacerlo así:

  1. Primero, cree un nuevo repositorio vacío

    $ mkdir repoclone
    $ cd repoclone/
    $ git init
    Initialized empty Git repository in /home/user/repoclone/.git/
    
  2. Luego agregue su repositorio bajo el nombre 'origin' (al igual que " git clone " lo nombraría), solicitando el seguimiento de solo dos ramas: 'master' y 'dev_swamy' , usando " git remote & Quot; mando. Verifique que se haya agregado correctamente.

    $ git remote add -t master -t dev_swamy origin user@example.com:repo.git
    $ git remote 
    origin
    $ git remote show origin
    * remote origin
      Fetch URL: user@example.com:repo.git
      Push  URL: user@example.com:repo.git
      HEAD branch: master
      Remote branches:
        master          new (next fetch will store in remotes/origin)
        dev_swamy new (next fetch will store in remotes/origin)
    

    Si la rama estable se llama 'estable' en lugar de 'maestra', por supuesto, debería modificar el ejemplo anterior. También hay una opción -m <branch> si desea que la rama especificada sea la rama predeterminada en el control remoto.

  3. Recuperar desde 'origen' (puede hacer esto también usando la opción -f para " git remote add " arriba):

    $ git fetch
    remote: Counting objects: 282, done.
    remote: Compressing objects: 100% (193/193), done.
    remote: Total 282 (delta 82), reused 0 (delta 0)
    Receiving objects: 100% (282/282), 81.30 KiB | 135 KiB/s, done.
    Resolving deltas: 100% (82/82), done.
    From user@example.com:repo.git
     * [new branch]      master     -> origin/master
     * [new branch]      dev_swamy -> origin/dev_swamy
    From user@example.com:repo.git
     * [new tag]         v1.0       -> v1.0
     * [new tag]         v1.0.1    -> v1.0.1
     * [new tag]         v1.1       -> v1.1
    
  4. Configure la rama local 'master' (donde haría su trabajo) para seguir 'origin / master' (tener 'origin / master' como upstream), al igual que " git clone < !> quot; haría:

    $ git checkout -t origin/master
    Branch master set up to track remote branch master from origin.
    Already on 'master'
    

    Puede repetir esto para la rama 'dev_swamy'.

  5. Ahora puede ver cómo se ve el archivo de configuración. Puede obtener exactamente el mismo resultado editando el archivo .git/config para que se vea como sigue, y luego haciendo " git fetch " .

    $ cat .git/config  # or just open this file in your editor
    [core]
            repositoryformatversion = 0
            filemode = true
            bare = false
            logallrefupdates = true
    [remote "origin"]
            url = user@example.com:repo.git
            fetch = +refs/heads/master:refs/remotes/origin/master
            fetch = +refs/heads/dev_swamy:refs/remotes/origin/dev_swamy
    [branch "master"]
            remote = origin
            merge = refs/heads/master
    

¡No olvide presentarse a Git antes de comenzar a trabajar en el repositorio (es decir, establecer las variables de configuración 'user.name' y 'user.email'; generalmente en el archivo de configuración por usuario)!

Otros consejos

Si clonas, todas las revisiones en todas las ramas se clonan, pero el repositorio clonado verificará el master de forma predeterminada.

Simplemente tomar ramas seleccionadas es más complicado ya que git realmente no cree que debas trabajar de esa manera. Tienes que tirar de las ramas manualmente:

mkdir repoclone
cd repoclone
git init
git remote add origin git://remote/url
git fetch origin master:master
git fetch origin dev_XXX:dev_XXX

Arriba está lo que sabía que funcionaba. Sin embargo, si desea configurar un repositorio git que funcione normalmente, ¿solo tiene una vista más estrecha de sus ramas remotas? Puedes hacerlo fácilmente:

mkdir repoclone
cd repoclone
git init
git remote add origin git://remote/url

# now open .git/config for editing in your editor
# replace the following line (grab all remote branches)
fetch = +refs/heads/*:refs/remotes/origin/*

# replace with lines listing exactly which branches you want
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/dev_XXX:refs/remotes/origin/dev_XXX

# save the file, now run

git fetch

Otra forma de hacer esto es evitar un clon directo, pero en su lugar agregue manualmente un control remoto con un conjunto personalizado de especificaciones de búsqueda.

por ejemplo

mkdir myclone
cd myclone
git init

git remote add origin url://origin.repo

# Add fetch rules for the branches that we want to track
git config remote.origin.fetch +refs/heads/master:+refs/remotes/origin/master
git config --add remote.origin.fetch +refs/heads/dev_swamy:+refs/remotes/origin/dev_swamy

# fetch now fetches just what we need, subsequently it will do incremental fetches
git fetch

# Creating local branches tracking the remote branches
git checkout -b master origin/master
git branch dev_swamy origin/dev/swamy

Creo que la pregunta más importante aquí es qué empujarán los demás, no qué clonarás o tirarás. Como cada desarrollador está trabajando en su propia sucursal, otra pregunta es cómo terminar con una base de código común. ¿Los desarrolladores están fusionando sus sucursales para dominar? ¿Y están empujando su rama maestra modificada a un repositorio central? Si ese es el caso, no hay forma de que extraiga las ramas de los otros desarrolladores de todos modos.

Si ese no es el caso, no veo cómo puedes formar un equipo funcional.

Y como finalmente pensé: ¿me gustaría saber por qué no querrías clonar las ramas de otros desarrolladores en tu repositorio?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top