2010-11-09 23 views
14

¿Hay alguna forma de verificar si existe un archivo bajo la ruta relativa especificada en un control remoto? Estoy bien con buscar la información primero si es la única opción. En otras palabras, estoy buscando git-ls-files con una opción para especificar remote y branch. Sólo me interesa si existe el archivo (una lista de archivos en la rama hará también), no me importa acerca de hashes, etc. diffs¿Cómo verifico si existe un archivo en un control remoto?

Respuesta

22

Usted puede utilizar

git cat-file -e <remote>:<filename> 

que será salir con cero cuando el archivo exista. En vez de <remote> arriba, usaría un nombre de sucursal remota (pero de hecho podría ser cualquier referencia de objeto árbol). Para utilizar una rama remota de este tipo, necesitará tener el repositorio remoto configurado y recuperado (es decir, usando git remote add + git fetch).

Un ejemplo concreto:

$ git cat-file -e origin/master:README && echo README exists 
README exists 

$ git cat-file -e origin/master:FAILME 
fatal: Not a valid object name origin/master:FAILME 

Dos cosas para tomar nota:

  • Uso / como delimitador de ruta en los nombres de archivo, incluso en, por ejemplo, Windows.
  • <filename> es una ruta completa (como foo/bar/README), relativa a la raíz del repositorio.
+1

por ' 'quiere decir una Remote Branch, lo que significa que debe haber configurado el control remoto y ejecutar 'git fetch ' first; está examinando la sucursal remota en su repositorio, por lo que debe asegurarse de que esté actualizado. – Cascabel

+0

Precisamente, gracias. Incorporé eso en la respuesta. – earl

6

Puede utilizar git archive acceder a archivos individuales sin necesidad de descargar ninguna otra parte de un repositorio:

if git archive --format=tar \ 
       --remote=<remote_name-or-URL> master README >/dev/null; then 
    echo 'master has README' 
else 
    echo 'master does not have README (or other error)' 
fi 

El servicio de archivo (upload-archive) puede no estar habilitado en todos los servidores o repositorios embargo, tendrá para probarlo para los servidores y repositorios a los que necesita acceder.

Si el servicio de archivo no está disponible, tendrá que buscar objetos por los medios normales.

Si aún no tiene una configuración remota para el repositorio en cuestión, puede hacer una búsqueda "superficial" en FETCH_HEAD (esto debe hacerse en un repositorio de Git, pero puede no estar relacionado ni estar vacío):

git fetch --depth=1 remote_name-or-URL master 
if git rev-parse --verify --quiet FETCH_HEAD:README >/dev/null; then 
    echo "repository's master has README" 
else 
    echo "repository's master does not have README" 
fi 

Si usted tiene un definido a distancia para el repositorio, entonces es probable que sólo quiere actualizar y acceder al archivo a través de las ramas de seguimiento a distancia normales:

git fetch remote_name 
if git rev-parse --verify --quiet remote_name/master:README >/dev/null; then 
    echo "remote's master has README" 
else 
    echo "remote's master does not have README" 
fi 
+0

¡Cosas geniales! Realmente útil –

+1

tenga cuidado: la solución 'git-archive' no funciona de manera confiable. parece comprobar solo la existencia de los archivos/directorios de nivel superior, por ejemplo, 'git archive --remote = master dir-que-existe/then/some/sinsentido/ruta' saldría con 0 –

Cuestiones relacionadas