2012-05-22 26 views
10

En primer lugar, el cuadro grande: Estoy tratando de escribir un post-git recibir guión para un servidor Redmine/Gitolite estoy corriendo. De acuerdo con diversas recomendaciones, estoy creando un repositorio desnudo y local para Redmine para leer, y yo estoy creación de un script de post-recepción en Gitolite para empujar cambios en el repositorio Redmine.Git Fetch no funciona con repo desnuda, pero git pull trabaja en repo normales

Sin embargo, estoy muy noobish con Git, así que soy incapaz de siquiera hacer una tarea simple aquí> _ <. Creo que si resuelvo esto, debería poder escribir el guión anterior. Después de configurar mi informe de prueba, he creado dos repositorios como prueba.

(El "Repo central" es un repositorio Gitolite en git @ localhost: prueba)

cd /tmp 
mkdir /tmp/test 
$ git clone [email protected]:testing 
$ git clone [email protected]:testing testing2 
$ git clone [email protected]:testing --bare 

Ahora en que funciono ls:

$ ls 
testing testing2 testing.git 

Ahora, puedo cambiar el archivo de prueba en el interior de la prueba2, y luego empuja los cambios al repositorio central.

$ cd testing2 
$ echo 'testline' >> test && git commit --allow-empty-message -a -m '' && git push 

Como esperaba, si ejecuto "git pull" en la carpeta "testing", todo funciona como se esperaba.

$ cd testing 
$ git pull 
remote: Counting objects: 5, done. 
remote: Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From localhost:testing 
    3242dba..a1ca5ba master  -> origin/master 
Updating 3242dba..a1ca5ba 
Fast-forward 
test | 1 + 
1 files changed, 1 insertions(+), 0 deletions(-) 
$ diff ./test ../testing2/test 
$ 

como se muestra con la última "diff", el directorio "prueba" y el trabajo directorio "testing2" exactamente como se esperaba. El comando "git pull" sincroniza los dos directorios.

Sin embargo, si copio en testing.git (alias: el repositorio desnudo), un git fetch/git reset --soft no actualiza el repo desnudo a la última versión.

$ ls 
branches config description HEAD hooks info objects packed-refs refs 
$ git fetch 
remote: Counting objects: 5, done. 
remote: Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From localhost:testing 
* branch   HEAD  -> FETCH_HEAD 
$ git reset --soft 
$ cd .. 
$ git clone ./testing.git testing3 
Cloning into testing3... 
done. 
$ cd testing3 
$ diff test ../testing2/test 
5a6 
> testline 

Como se puede ver en el ejemplo anterior, el repositorio desnudo no pudieron recibir información actualizada, y no es de alguna manera una diferencia entre los dos archivos. ¿Qué hice mal?

Gracias de antemano

Respuesta

25

de Explorar no ha actualizado la rama master, solamente FETCH_HEAD (ver "What does FETCH_HEAD in Git mean?").

Como se mencionó en "how do I pull to a bare repository?", usted debe hacer una:

git fetch origin master:master 

O, para all the branches:

git fetch origin +refs/heads/*:refs/heads/* 

Colin D Bennett añadido:

Si desea para buscar estos en un b regular asis, usted debe considerar:

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

que permitirá escribir git fetch para sincronizar sus ramas con el mando a distancia.
Tenga en cuenta que esto sentido sólo en un repositorio desnudo donde no se supone que las sucursales locales a ser editado.

+0

Gracias. Muchos problemas parecen deberse a mi falta de comprensión de las ramificaciones ... así que me aseguraré de leer sobre ello. – Dragontamer5788

+5

Si desea recuperar estos con regularidad, debe considerar: '' git config remote.origin.fetch + refs/heads/*: refs/heads/* '', que le permitirá escribir '' git fetch '' sincronizar sus ramas con el control remoto. Tenga en cuenta que esto solo tiene sentido en un repositorio vacío donde no se supone que las ramas locales deben editarse. – vaab

+0

@ColinDBennet gracias por la edición :) – VonC