Datei mit Git als "unverbindlich" markieren

41

Ich möchte einige meiner Arbeiten zur Schau stellen, indem ich sie auf mein GitHub-Konto hochlade. Es gibt jedoch einige Dateien, die Kennwörter enthalten, z. B. Datenbankverbindungen.

Gibt es eine Möglichkeit, eine Datei mit Git als nicht festschreibbar zu kennzeichnen, sodass sie nicht auf GitHub angezeigt werden kann?

Adam Carter
quelle
1
Tangentialer Vorschlag: Dies trifft möglicherweise nicht auf alle Plattformen zu, da einige sehr mit Konfigurationsdateien verheiratet sind. Sie können jedoch den 12factor-Ansatz in Betracht ziehen, diese Parameter in der Umgebung zu belassen : 12factor.net/config . Das heißt, der Anwendungscode darf niemals das Vorhandensein einer Konfigurationsdatei annehmen. (Im Gegensatz zu einem privaten Startskript, das diese festlegt, aber niemals Ihren lokalen Computer verlässt.)
millimoose
1
Wenn Sie sie versehentlich festschreiben, stellen Sie sicher, dass Sie sie aus dem vollständigen Git-Verlauf entfernen (andere Fragen erläutern, wie), da die alte festgeschriebene Version auch dann im Verlauf verbleibt und auf Github sichtbar ist, wenn Sie sie löschen und ignorieren.
curiousdannii
3
Beachten Sie, dass alle Antworten Ihre Frage nicht wirklich beantworten. Sie machen die Datei nicht unverbindlich, sondern konfigurieren git einfach so, dass es sie standardmäßig ignoriert. Wenn Sie diesen Dateinamen jedoch versehentlich in eine git-Befehlszeile einfügen, können Sie ihn am Ende festschreiben, obwohl er mit einem Muster in übereinstimmt .gitignore. AFAIK: Es gibt keine hundertprozentige gitsichere Methode, um das Festschreiben einer bestimmten Datei in allen Fällen zu vermeiden. Dies kann jedoch als eine Funktion angesehen werden, mit der explizite Befehle generische Konfigurationen überschreiben können.
Bakuriu
Sie könnten die fest codierten Passwörter entfernen und zu einer sichereren Alternative wechseln. Danach können Sie die Datenbank-Passwörter wechseln. Die alten Passwörter sind immer noch in den Commits enthalten, aber sie sind veraltet, sobald jemand in der Lage ist, sie zu lesen, als Sie es können. Ich bin mir ziemlich sicher, dass Sie ein Commit nicht mehr ändern können, wenn es bereits aufgebaut ist.
BlueWizard
3
Zusätzlich zu dem, was @curiousdannii gesagt hat, enthält GitHub eine ganze Seite, auf der erläutert wird, wie Sie vertrauliche Daten entfernen, die Sie versehentlich übermittelt haben. Auf dieser Seite wird unter anderem angegeben, dass Kennwörter und Schlüssel geändert werden sollen, die Sie versehentlich veröffentlicht haben. help.github.com/articles/remove-sensitive-data
Kevin - Reinstate Monica

Antworten:

67

Gibt es eine Möglichkeit, eine Datei mit Git als nicht festschreibbar zu kennzeichnen, sodass sie nicht auf GitHub angezeigt werden kann?

Erstens gibt es keine Möglichkeit, dass einige Dateien und Commits in Ihrem lokalen Git-Repository sichtbar sind, aber irgendwie nicht in GitHub angezeigt werden können. Wenn Sie eine in Git festgeschriebene Datei haben, wird diese in GitHub angezeigt.

Zweitens gibt es keine einfache und praktische Möglichkeit, jemals eine einzelne Datei markiert selbst als Aber es gibt „uncommitable.“ Auf jeden Fall eine Möglichkeit , eine Datei in einem Git zu ignorieren Repo: Durch das Hinzufügen der Datei (en) -einschließlich ihren relativen Pfad , wenn benötigt - in eine .gitignoreDatei :

Eine .gitignoreDatei gibt absichtlich nicht verfolgte Dateien an, die Git ignorieren soll. Bereits von Git erfasste Dateien sind nicht betroffen. Einzelheiten finden Sie in den nachstehenden ANMERKUNGEN.

Das Erstellen einer .gitignoreeinfachen Datei ist relativ einfach, da es sich lediglich um eine reine Textdatei handelt. Wenn ich zum Beispiel eine config.phpDatei in Ihrem Stammverzeichnis hätte, würden Sie dies tun. vorausgesetzt, Sie verwenden PHP, aber das Konzept gilt für jedes Setup. In diesem Beispiel verwende ich auch Nano als Texteditor. Sie können jedoch auch den Texteditor verwenden, den Sie normalerweise verwenden:

nano .gitignore

Und fügen Sie einfach diesen Dateinamen zu dieser Datei hinzu:

config.php

Speichern Sie es und Git ignoriert diese Datei einfach.

Das heißt, was ich für Setups wie dieses tun möchte, ist, eine Beispielkonfiguration mit sensiblen Details im Repository zu neutralisieren, damit ich einen Hinweis darauf habe, welches Konfigurationsdateiformat eine Datei mit folgendem Namen ist:

config.SAMPLE.php

Auf diese Weise wissen Sie genau, wie die config.phpDatei eingerichtet werden soll, config.SAMPLE.phpund Sie können sicherstellen, dass config.phpGit die eigentliche Datei niemals berührt.

Wenn Sie vorhaben, Ihren Code vorzuführen, müssen Sie damit rechnen, dass jemand versucht, diesen Code zu übernehmen und auf irgendeine Weise auf seinem eigenen System zu implementieren. Denken Sie daran, wir sind nicht Sie und ohne eine Beispielkonfigurationsdatei in Ihrem Repo werden die Leute nicht wirklich verstehen, wie man den Code selbst implementiert. Vielleicht denken sie sogar, dass Sie nicht kompetent sind, weil Sie kein grundlegendes Konfigurationsbeispiel angegeben haben.

JakeGould
quelle
11
+1 für die richtige Antwort und einen Vorschlag für eine Beispielkonfigurationsdatei. Es gibt einige Bibliotheken wie Figaro für Ruby, die Sie in diese Richtung drängen. Sie sollten eine Beispieldatei mit Werten übergeben lassen, die den tatsächlichen Werten ähnlich sind, damit die Person, die Ihren Code betrachtet, weiß, wie die Umgebung aussehen sollte. Einige Plattformen, wie Heroku, verwenden Umgebungsvariablen, so dass Sie möglicherweise Ihre Konfiguration auf etwas festlegen wie database_url = Environment.DATABASE_URLund einen Kommentar wie oben hinterlassen # postgres://username:password@localhost/dbname.
Chris Cirefice
@ ChrisCirefice Danke! Mich wundert immer wieder, dass es neue „Tools“ gibt, die Sie an das Offensichtliche erinnern sollten: Wenn dieser Code von anderen Menschen gelesen werden soll und nicht erklärt, wie eine Konfiguration funktioniert, was genau macht das? Danke noch einmal.
JakeGould
27

Sie können auch einen Pre-Commit-Hook hinzufügen, um die Integritätsprüfungen zu implementieren. Das Verzeichnis .git/hooksjedes Git-Repositorys enthält einige Beispielskripte.

Das aufgerufene Skript pre-commitwird ausgeführt, wenn es vor jedem Commit vorhanden ist, und ein Rückgabewert ungleich Null bricht das Commit ab.

Sie könnten beispielsweise ein einfaches Skript wie das folgende haben:

#! /bin/sh -e
git ls-files --cached | grep -qx 'filename' && { echo "Excluded file included in the commit" >&2; exit 1; }
exit 0

Wenn dies filenamezutrifft, schlägt das Festschreiben fehl.

Juho Östman
quelle
1
+1 Dies ist die richtige Antwort, die das explizite Hinzufügen und Übernehmen der Datei verhindert.
R ..
Obwohl empfohlen wird, sich nicht auf diese Prävention zu verlassen (dh stattdessen `.gitignore zu verwenden).
David Z
2
@R .. Ja und nein. Während die Frage lautet, „eine Datei als verbindlich zu kennzeichnen“, verhindert der Geist, dass eine Datei festgeschrieben wird. Die Realität, die entsteht, .gitignoreist eine weit verbreitete und allgemein verständliche Praxis für jeden, der Git verwendet. Ein Pre-Commit-Skript wird jedoch von den meisten Git-Benutzern nicht wirklich verwendet. Es erfordert einige Setup-Kenntnisse und einen triftigen Grund, warum eine solche Methode der einfachen Verwendung einer .gitignoreDatei vorzuziehen wäre . Dies ist sehr nützlich für einige komplexere Fälle, aber es ist definitiv ein Konzept, das Sie verwenden würden, wenn Sie wirklich wissen, dass Sie es verwenden müssen.
JakeGould
2
Ich könnte dies in Situationen verwenden, in denen Sie .gitignore möglicherweise nicht 100% vertrauen (Sie könnten etwas Dummes tun, indem Sie versehentlich verlangen, dass git die Datei zum Festschreiben hinzufügt). Oder vielleicht bearbeitet jemand anderes die .gitignore-Datei (schließlich unterliegt sie der Versionskontrolle). Wenn Sie wirklich einen überprüfbaren Prozess benötigen, können Sie in einen solchen Prozess einarbeiten.
Cort Ammon
@CortAmmon Es geht nicht immer um Vertrauen. Sie können Ihrem Quellcode temporäre und nicht öffentliche Debug-Informationen hinzufügen , die Sie nicht festschreiben möchten, die Sie jedoch nicht ignorieren können. Stattdessen solltest du es überprüfen, bevor du es festschreibst, wenn es nichts Illegales enthält . Dies scheint eine gute Lösung für diesen Anwendungsfall zu sein. Und genau so fand ich diese Frage, weil es mein Anwendungsfall ist.
t3chb0t
12

Was @JakeGould gesagt hat. In einigen Fällen könnten Sie auch die Verwendung von spezieller Datei Bits machen wie skip-worktreeoder assume-unchangeddass die folgende Art und Weise eingestellt werden; Informationen zu den Unterschieden zwischen den beiden finden Sie in der folgenden Antwort zum Stapelüberlauf :

git update-index --assume-unchanged <file>

Welche versteckt dann zusätzliche Änderungen an einer bereits vorhandenen Datei und welche können Sie verwenden, wenn eine Datei wirklich nach jedem Abruf vorhanden sein soll. Aber ich würde dir raten, es nur zu benutzen, wenn du wirklich weißt, was du tust.

phk
quelle
8

Verwenden Sie ein .gitignorewie @JakeGould sagte. Darüber hinaus einige verwandte Informationen:

  • .gitignoreVerhindert, dass Dateien verfolgt werden. Wenn sie bereits verfolgt werden git rm --cached, entfernen Sie sie mit
  • Dateien / Muster in $GIT_DIR/info/excludewerden ebenfalls ignoriert
  • Dateien / Muster in der Datei, die in der Datei core.excludesFile des Benutzers angegeben ist, werden ~/.gitconfigebenfalls ignoriert.

Weitere Informationen finden Sie in der offiziellen Git-Dokumentation .

46und2
quelle
2

So erweitern Sie die Antworten von Jake und 46: Eine sehr gute Vorgehensweise besteht darin, eine einheitliche Erweiterung für Dateien zu verwenden, in die Sie private Informationen einfügen, und .gitignoreDateien mit dieser Erweiterung immer global auszuschließen (wobei die .gitconfigDatei, wie an anderer Stelle erwähnt, immer ignoriert wird) für Ihren Benutzer).

Auf diese Weise können Sie zum Beispiel Folgendes haben:

/projectname/mypasswords.exc 

und wenn Sie *.excglobal ausgeschlossen haben , wissen Sie, dass es nicht festgeschrieben wird, selbst wenn Sie vergessen, diese bestimmte Datei einzeln auszuschließen.

Joe
quelle