Comprometerse directamente con un repositorio desnudo

4 minutos de lectura

algo de contexto

en qué encaja esto

Una aplicación web centrada en la colaboración que ofrece alojamiento git (como bare repos)

lo que queremos hacer

Permita que los usuarios agreguen un conjunto de archivos directamente a sus repositorios existentes.

Mi pregunta

¿Existe alguna herramienta o método para crear manualmente una confirmación que solo implique agregar nuevos archivos a un repositorio de git?

Ahora podemos hacer esto usando pagos dispersos temporales del lado del servidor, pero nos gustaría optimizar este proceso.

  • ¿Qué quiere decir con “crear una confirmación que solo implique agregar nuevos archivos”? ¿En qué se diferencia eso de un compromiso normal?

    – Andrés Marshall

    12 mar. 12 a las 15:53

  • ¿Parece que desea tener una aplicación web donde las personas puedan cargar archivos, y esos archivos, en el backend, se comprometan con un repositorio de git? ¿En qué idioma está el sitio web? Es probable que necesite encontrar una biblioteca para interactuar con git para cualquier idioma que esté usando.

    – Codificación con Spike

    12 mar. 12 a las 16:07

  • @rally25rs Estamos usando una aplicación python wsgi, pero no nos preocupa tanto el idioma o los paquetes que necesitamos usar para hacer esto. Cualquier método puede activarse desde el sitio como un subproceso.

    – renacimiento

    12 mar. 12 a las 18:37

  • También estoy interesado en este tema; Lo necesito para phorkie, mi herramienta pastebin basada en git.

    – cweiske

    04 abr.


  • Este problema ha estado en mi segundo plano mientras trabajaba en otras partes de la plataforma, pero tendré que volver a abordarlo pronto. Si no se puede encontrar ningún módulo o biblioteca, me gustaría comenzar uno como un proyecto ligero de código abierto. Para nuestra plataforma, hacer de este un módulo de Python tiene sentido, pero sería beneficioso hacerlo en un formato común con múltiples enlaces de idiomas. Si alguien está interesado en contribuir o liderar este pequeño proyecto, por favor hágamelo saber.

    – renacimiento

    04 abr.


Comprometerse directamente con un repositorio desnudo
Por Johansson

El fontanería y porcelanato La página tiene un ejemplo de esto, pero intentaré simplificarlo.

Parece que los repositorios básicos todavía tienen un índice, que se puede manipular y convertir en una confirmación. Probablemente también sea posible crear un objeto de árbol desde cero, pero no sé exactamente cómo.

Probablemente tenga que bloquear el repositorio si existe el riesgo de que otra persona pueda acceder a él al mismo tiempo. simplemente usaré lockfile desde el procmail paquete aquí.

#!/bin/bash
cd myrepo.git

MY_BRANCH=master
MY_FILE_CONTENTS=$'Hello, world!n'

# Note this is just a lock for this script. It's not honored by other tools.
lockfile -1 -r 10 lock || exit 1

PARENT_COMMIT="$(git show-ref -s "$MY_BRANCH")"

# Empty the index, not sure if this step is necessary
git read-tree --empty

# Load the current tree. A commit ref is fine, it'll figure it out.
git read-tree "${PARENT_COMMIT}"

# Create a blob object. Some systems have "shasum" instead of "sha1sum"
# Might want to check if it already exists. Left as an excercise. :)
BLOB_ID=$(printf "blob %d%s" $(echo -n "$MY_FILE_CONTENTS" | wc -c) "$MY_FILE_CONTENTS" | sha1sum | cut -d ' ' -f 1)
mkdir -p "objects/${BLOB_ID:0:2}"
printf "blob %d%s" $(echo -n "$MY_FILE_CONTENTS" | wc -c) "$MY_FILE_CONTENTS" | perl -MCompress::Zlib -e 'undef $/; print compress(<>)' > "objects/${BLOB_ID:0:2}/${BLOB_ID:2}"

# Now add it to the index.
git update-index --add --cacheinfo 100644 "$BLOB_ID" "myfile.txt"

# Create a tree from your new index
TREE_ID=$(git write-tree)

# Commit it.
NEW_COMMIT=$(echo "My commit message" | git commit-tree "$TREE_ID" -p "$PARENT_COMMIT")

# Update the branch
git update-ref "refs/heads/$MY_BRANCH" "$NEW_COMMIT" "$PARENT_COMMIT"

# Done
rm -f lock

Sería bueno si hubiera comandos git para crear blobs, pero no encontré ninguno. El comando perl fue tomado de otra pregunta.

  • En cuanto a cómo crear un objeto de árbol/mancha desde cero, parece que hay un comando llamado git hash-object que puede hacer eso por usted, y también lo agrega al almacén de objetos cuando le pasa el -w bandera. git-scm.com/docs/git-hash-objeto

    – Qqwy

    24 oct.

Comprometerse directamente con un repositorio desnudo
Ámbar

El “Fontanería y Porcelanato” El capítulo de Pro Git brinda información sobre el funcionamiento interno de Git, que puede aprovechar para crear compromisos y omitir algunos de los procesos normales de Git.

  • ¡Nunca resolví esto por completo, pero felicidades por tener la mejor respuesta!

    – renacimiento

    27 jun.

Creé la muestra para los archivos git add/rm en un repositorio simple usando JGit. Verificar https://github.com/junoyoon/git-online-commit-sample. En el código de prueba, puede saber cómo usar las API de JGit para la manipulación de repositorios básicos.

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad