Soy un profesor que escribe problemas de codificación para estudiantes. Lo que quiero hacer es dar a los estudiantes el código repetitivo con marcadores de posición para las funciones que los estudiantes deben completar. Les daré a los estudiantes acceso a un repositorio privado de Github para clonar esto.
Sin embargo, también quiero una versión de la base de código, completa con soluciones de muestra. Obviamente no quiero que los estudiantes tengan acceso a la solución (hasta que termine la tarea).
He pensado en las sucursales, pero AFAIK, no puedo mantener una sucursal privada.
Tal vez podría bifurcar el proyecto en otro repositorio privado, pero no estoy seguro de cómo podría mantener los proyectos en snyc (aparte del archivo que contiene la solución).
¿Hay un flujo de trabajo para esta situación?
Respuestas:
Lo que podría ser bastante factible:
Entonces su estructura de directorio es 2 clones de repositorios de git:
Pones marcadores alrededor del código "privado" en los comentarios para tu idioma, por ejemplo, javascript a continuación. Los marcadores indican dónde comienza y termina el código privado.
Luego haga un script simple en su máquina local:
Tomará todos sus archivos y copiará el contenido a / student (sobrescritura) sin las partes privadas marcadas del código. Si lo desea, puede insertar líneas vacías allí, pero eso puede dar una pista sobre qué tipo de solución espera.
Es un código de ejemplo no probado, por lo que es probable que deba realizar alguna depuración.
Ahora lo único que tiene que hacer es comprometerse e ingresar al repositorio de estudiantes cuando esté satisfecho con el resultado. Eso se puede hacer con un solo clic cuando se usa el cliente GitHub (para que pueda hacer una revisión visual rápida) o simplemente hacerlo manualmente en la línea de comandos.
El repositorio de estudiantes es un repositorio de salida solo, por lo que siempre estará actualizado, para los estudiantes está claro qué ha cambiado al observar los commits (porque solo muestran cambios) y es fácil de manejar.
Un paso más allá sería crear un git commit-hook que ejecute automáticamente su script.
Editar: veo que has realizado una edición en tu publicación:
Sospecho que está claro, pero para completar: simplemente elimine las etiquetas alrededor del ejercicio terminado y publicará la respuesta de la misma manera que lo haría para las actualizaciones normales de los ejercicios.
fuente
Tú podrías
Así es como implementaría este flujo de trabajo:
assignments
alojado en GitHub. Agregue el código repetitivo para las asignaciones. Por ejemplo, para cada tarea, introduce un nuevo subdirectorio que contiene el código repetitivo de la tarea.assignments-solved
en GitHub. Clone elassignments
repositorio en su máquina y empújelo alassignments-solved
repositorio (esencialmente bifurque su propio repositorio como una copia privada):git clone https://github.com/[user]/assignments assignments-solved cd assignments-solved git remote set-url origin https://github.com/[user]/assignments-solved git push origin master git push --all
assignments-solved
repositorio como remoto alassignments
repositorio:cd assignments # change to the assignments repo on your machine git remote add solutions https://github.com/[user]/assignments-solved
assignments-solved
repositorio. Asegúrese de que cada confirmación contenga solo los cambios de una tarea.solved
rama en elassignments
repositorio, para que las asignaciones originales no se modifiquen:cd assignments # change to the assignments repo on your machine git branch -b solutions git push -u origin
assignments
, busque elsolved
control remoto ycherry-pick
las confirmaciones que contienen las soluciones.cd assignments # change to the assignments repo on your machine git checkout solved git fetch solutions git cherry-pick [commithash]
Donde[commithash]
contiene el compromiso de su solución.También puede implementar el flujo de trabajo implementando cada asignación en una rama separada del
assignments-solved
repositorio y luego creando una solicitud de extracción en elassignments
repositorio. Pero no estoy seguro de si esto funcionará en GitHub, ya que elassignments-solved
repositorio no es una bifurcación real .fuente
Solo puedo proponerle una utilidad destinada a
.gitignore
codificar y cifrar archivos en su repositorio. El flujo de trabajo es un poco difícil de usar, pero hace que las contrapartes cifradas de sus archivos estén disponibles en la copia de trabajo junto con otros archivos no secretos, lo que permite rastrearlos por git como de costumbre.Para crear un archivo secreto con el
a.txt
tipo de nombre de archivosshare -a a.txt
. Utilidad crear archivoa.txt
y archivo agregado a.gitignore
. Luego crea una contraparte de "base de datos" encriptadaa.txt.sshare
agregando.sshare
extensión al nombre de archivo.Entonces puedes llenar
a.txt
con algo de texto. Para guardar su estado justo antes degit commit
escribirsshare -s a.txt
, la utilidad le pedirá una contraseña para cifrar el nuevo estado del archivoa.txt
. Luego, la utilidad que utiliza esta contraseña agrega diferencias cifradas entre el estado anterior y actual del archivoa.txt
al final dela.txt.sshare
archivo.Después de buscar / extraer el repositorio con archivos cifrados, debe ejecutar la
sshare
utilidad para cada archivo usando la-l
tecla ("cargar"). En este caso, la utilidad descifra*.sshare
archivos a archivos de texto no rastreados por git en la copia de trabajo.Puede usar diferentes contraseñas para cada archivo secreto.
La utilidad permite que git rastree los cambios de manera eficiente (la diferencia de
.sshare
archivos es simplemente una línea).fuente