Ich bin ein Dozent, der Codierungsprobleme für Studenten schreibt. Ich möchte den Schülern den Code mit den Platzhaltern für die Funktionen geben, die die Schüler ausführen sollen. Ich werde den Schülern Zugang zu einem privaten Github-Repo geben, um dies zu klonen.
Ich möchte jedoch auch eine Version der Codebasis mit Beispiellösungen. Natürlich möchte ich nicht, dass die Schüler Zugriff auf die Lösung haben (bis die Aufgabe beendet ist).
Ich habe über Filialen nachgedacht, aber AFAIK, ich kann nicht eine Filiale privat halten.
Vielleicht könnte ich das Projekt in ein anderes privates Repo aufteilen, bin mir aber nicht sicher, wie ich die Projekte in snyc halten könnte (abgesehen von der Datei, die die Lösung enthält).
Gibt es einen Workflow für diese Situation?
Antworten:
Was könnte durchaus machbar sein:
Ihre Verzeichnisstruktur besteht also aus 2 geklonten Git-Repos:
Sie setzen Markierungen um den "privaten" Code in Kommentaren für Ihre Sprache, Beispiel Javascript unten. Die Markierungen geben an, wo der private Code beginnt und endet.
Erstellen Sie dann ein einfaches Skript auf Ihrem lokalen Computer:
Es wird: alle Ihre Dateien nehmen und den Inhalt ohne die privat markierten Teile des Codes nach / student kopieren (überschreiben). Wenn Sie möchten, können Sie dort leere Zeilen einfügen. Dies kann jedoch einen Hinweis darauf geben, welche Art von Lösung Sie erwarten.
Es ist ungetesteter Beispielcode, daher müssen Sie wahrscheinlich etwas debuggen.
Jetzt müssen Sie nur noch das Schüler-Repository festschreiben und verschieben, wenn Sie mit der Ausgabe zufrieden sind. Dies kann mit einem Klick erfolgen, wenn Sie den GitHub-Client verwenden (damit Sie eine schnelle visuelle Überprüfung durchführen können) oder einfach manuell über die Befehlszeile.
Das Schüler-Repo ist nur ein Ausgabe-Repository, damit es immer auf dem neuesten Stand bleibt. Den Schülern wird durch Betrachten der Commits klar, was sich geändert hat (da sie nur Änderungen anzeigen), und es ist einfach zu handhaben.
Ein weiterer Schritt wäre, einen Git-Commit-Hook zu erstellen, der Ihr Skript automatisch ausführt.
Bearbeiten: Wir sehen, dass Sie Ihren Beitrag bearbeitet haben:
Ich vermute, es ist klar, aber um vollständig zu sein: Entfernen Sie einfach die Tags um die fertige Übung, um die Antwort auf die gleiche Weise zu veröffentlichen, wie Sie es für normale Aktualisierungen der Übungen tun würden.
quelle
Du könntest
So würde ich diesen Workflow implementieren:
assignments
das auf GitHub gehostet wird. Fügen Sie den Boilerplate-Code für die Zuweisungen hinzu. Zum Beispiel führen Sie für jede Aufgabe ein neues Unterverzeichnis ein, das den Boilerplate-Code der Aufgabe enthält.assignments-solved
auf GitHub. Klonen Sie dasassignments
Repo auf Ihrem Computer und verschieben Sie es in dasassignments-solved
Repo (im Wesentlichen teilen Sie Ihr eigenes Repository als private Kopie auf):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
Repo als Remote zumassignments
Repo hinzu:cd assignments # change to the assignments repo on your machine git remote add solutions https://github.com/[user]/assignments-solved
assignments-solved
Repository. Stellen Sie sicher, dass jedes Commit nur Änderungen aus einer Zuweisung enthält.solved
Verzweigung imassignments
Repo erstellen , damit die ursprünglichen Zuordnungen nicht geändert werden:cd assignments # change to the assignments repo on your machine git branch -b solutions git push -u origin
assignments
, rufen Sie diesolved
Fernbedienung undcherry-pick
die Commits mit den Lösungen ab.cd assignments # change to the assignments repo on your machine git checkout solved git fetch solutions git cherry-pick [commithash]
Wo[commithash]
enthält das Commit Ihrer Lösung.Möglicherweise können Sie den Workflow auch implementieren, indem Sie jede Zuweisung in einem separaten Zweig des
assignments-solved
Repos implementieren und dann eine Pull-Anforderung imassignments
Repo erstellen . Ich bin mir aber nicht sicher, ob dies in GitHub funktionieren wird, da dasassignments-solved
Repo keine echte Gabel ist.quelle
Ich kann Ihnen nur ein Dienstprogramm vorschlagen, mit dem Sie
.gitignore
Dateien in Ihrem Repository verschlüsseln können. Der Workflow ist etwas schwierig zu verwenden, macht jedoch die verschlüsselten Gegenstücke Ihrer Dateien zusammen mit anderen nicht geheimen Dateien auf der Arbeitskopie verfügbar, sodass Sie sie wie gewohnt per Git verfolgen können.So erstellen Sie eine geheime Datei mit dem Dateinamen
a.txt
typesshare -a a.txt
. Dienstprogramm Datei erstellena.txt
und Datei hinzugefügt.gitignore
. Anschließend wird ein verschlüsseltes Gegenstück zur "Datenbank" erstellt,a.txt.sshare
indem.sshare
dem Dateinamen eine Erweiterung hinzugefügt wird .Dann können Sie
a.txt
mit etwas Text füllen . Um seinen Zustand direkt vor speicherngit commit
Typsshare -s a.txt
, dann Dienstprogramm Aufforderung für Sie Kennwort Neuzustand der Datei zu verschlüsselna.txt
. Wenn Sie dieses Kennwort verwendena.txt
, wird am Ende dera.txt.sshare
Datei ein verschlüsselter Unterschied zwischen dem vorherigen und dem aktuellen Dateistatus hinzugefügt .Nach dem Abrufen / Ziehen des Repositorys mit verschlüsselten Dateien sollten Sie das
sshare
Dienstprogramm für jede Datei mit dem-l
Schlüssel ("Laden") ausführen . In diesem Fall entschlüsselt das Dienstprogramm*.sshare
Dateien in Textdateien, die von git in der Arbeitskopie nicht verfolgt werden.Sie können für jede geheime Datei unterschiedliche Passwörter verwenden.
Das Dienstprogramm ermöglicht es git Spur ändert effizient ( diff von
.sshare
Dateien ist einfach eine Zeile).quelle