Лучший рабочий процесс для управления упражнениями для студентов - PullRequest
2 голосов
/ 23 января 2020

TLDR; Цель состоит в том, чтобы поддерживать два кода (если возможно, на одном репо, если не на двух), один, содержащий упражнения, и другой, который также содержит исправление, избегая дублирования кода до возможный. Обычные пользователи не должны иметь возможность читать исправленный код. Любой трюк приветствуется.

Длинная версия:

Я пытаюсь сделать следующее: идея в том, что мы несколько «учителей», и мы работают над некоторыми упражнениями по программированию для наших студентов. Обычно у нас есть 3 вида «ресурсов»:

  1. ресурсов, к которым студенты имеют доступ, но теоретически не должны их изменять (например, библиотеки, ресурсы, тесты, которые будут выполняться CI ...)
  2. ресурсы, которые ученики должны изменить, например, каркас приложения
  3. ресурсы, которые не должны читаться студентами, обычно это исправление упражнения

Что мы пока что у нас есть два репозитория, один приватный для учителей (с исправлением) и один общедоступный c для учеников, затем ученики перенаправляют общедоступный канал c в частный, добавляют учителей в качестве сопровождающих. и работай отсюда.

Однако немного раздражает дублирование кода между двумя репозиториями. Есть ли более разумный вариант, который git (или, более конкретно, gitlab, поскольку это инструмент, который мы используем, мы используем CI для автоматического тестирования кода учащихся), может позволить нам защитить некоторые файлы от чтения / клонирования? Или есть какой-то другой способ легко поддерживать два репозитория, которые отличаются только одним файлом?

Ответы [ 2 ]

1 голос
/ 23 января 2020

У вас может быть два удаленных репозитория, скажем solution (который содержит личный код) и student (который содержит общедоступный код c, над которым студенты должны работать).

Put весь ваш код, кроме решения, в ветке b1 в solution. Создайте новую ветку b2 off b1 и pu sh секретный код там. Затем синхронизируйте c только ветвь b1 с другим пультом, student.

Затем ученики могут разветвляться student и работать оттуда. Если вам нужно сравнить код, вы можете использовать git diff со своей частной веткой, чтобы увидеть все, что было изменено. Вы также можете объединить изменения в указанный файл c в коде ученика с вашей веткой fre sh b1, чтобы быстро отменить любые другие изменения.

0 голосов
/ 23 января 2020

Я использовал метод, предложенный GoodDeeds (спасибо!), Но чтобы объединить две ветви, я написал несколько сценариев (которыми легко поделиться с другими учителями), которые могут быть полезны для других:

Сценарий, который объединяет ветви, убедившись, что файлы в FILES_TO_REMOVE не присутствуют в студенческой версии, и FILES_NOT_MERGED больше не синхронизируются.

Я также написал скрипт для автоматического вывода sh ветвь students на ветке master второго пульта:

#!/usr/bin/env bash
# This script will push the students branch on the student online repo.
set -e
NAME_REMOVE="students_repo"
DEFAULT_REMOTE="https://gitlab.com/3i024_2020/tme_01_mono_students"

if ! git config "remote.${NAME_REMOTE}.url" > /dev/null; then
    echo "### I will add a new remote named 'students_repo'."
    echo "What is the adress of this remote? (default is '${DEFAULT_REMOTE}'):"
    read -p "" remote
    remote=${remote:-$DEFAULT_REMOTE}
    git remote add students_repo "$remote"
    echo "New remote created!"
fi
echo "### Please, make sure you merged your branch with the student branch with:"
echo "$ gestion/merge_student.sh "
echo ""
echo "### I will now push the students branch on the master branch"
echo "### of the 'students_repo' remote."
git push students_repo students:master
echo "### Done!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...