2008-09-11 10 views
39

Wie speichern Sie Dateiberechtigungen in einem Repository? Einige Dateien müssen schreibgeschützt sein, um zu verhindern, dass sie von einem Drittanbieterprogramm gelöscht werden. Nach dem Auschecken aus dem Repository werden sie jedoch schreibgeschützt.Speichern von Dateiberechtigungen im Subversion-Repository

Ich schaute auf Google und fand eine blog post from 2005, die besagt, dass Subversion Dateiberechtigungen nicht speichert. Es sind Patches und Hook-Skripte aufgelistet (nur eine URL existiert noch). Drei Jahre später speichert Subversion immer noch keine Dateiberechtigungen und sind Hooks die einzige Möglichkeit, dies zu tun? (Ich habe noch nie Hooks gemacht und stattdessen etwas verwendet, das nativ für Subversion ist.)

+1

gute und alte Frage. Die Antwort bleibt jedoch bis heute unverändert. Es gibt keine Möglichkeit, chmod in SVN-Datei außer + x zu ändern. Ich wandern, wenn in Git möglich ist – confiq

+1

@confiq Sehr möglich in Git. In der Tat können Sie eine Änderung festschreiben, die nur Berechtigungen ändert. Allerdings weiß ich nicht, was passieren würde, wenn Sie diese Commit an svn schieben :) –

Antwort

9

Eine mögliche Lösung wäre, ein Skript zu schreiben, das Sie mit dem Rest Ihres Codes einchecken und das als erstes ausgeführt wird Schritt Ihres Build-Prozesses.

Dieses Skript durchläuft Ihre Kopie der Codebasis und legt Leseberechtigungen für bestimmte Dateien fest.

Idealerweise würde das Skript die Liste der Dateien aus einer einfachen Eingabedatei lesen. Dies würde es anderen Entwicklern leicht machen, zu pflegen und einfach zu verstehen, welche Dateien als schreibgeschützt gekennzeichnet werden.

+0

Überraschung: Subversion scheint tatsächlich * ändern * Berechtigungen, wenn Sie commit :( –

-6

Verwenden Sie svn lock, um anderen das Schreiben in die Datei zu verbieten.

0

Locking würde dieses Problem nicht lösen. Sperren hindert andere daran, die Datei zu bearbeiten. Dies ist eine Anwendung von Drittanbietern, die als Teil des Build-Prozesses ausgeführt wird, der versucht, in eine Datei zu schreiben - sie zu ändern - wodurch der Build-Prozess unterbrochen wird. Deshalb müssen wir das Programm daran hindern, die Datei zu ändern, die die Datei nur als schreibgeschützt markiert. Wir möchten, dass diese Informationen im Repository gespeichert und über Checkins, Filialen usw. übertragen werden.

0

Graham, svn speichert keine Berechtigungen. Ihre einzige Option besteht darin, Ihren Anruf in einem Skript in svn zu verpacken. Das Skript sollte svn mit seinen Argumenten aufrufen und anschließend die Berechtigungen festlegen. Abhängig von Ihrer Umgebung müssen Sie möglicherweise Ihr Skript svn aufrufen und Ihre PATH optimieren, um sicherzustellen, dass sie aufgerufen wird.

Ich mag die Idee von morechilli, die Liste der Dateien und Berechtigungen im Repository selbst zu überprüfen.

0

Wir haben eine Batch-Datei erstellt, um dies für uns zu tun. Würde tatsächlich Unterstützung in Subversion though bevorzugen ...

13

Es gibt keine native Möglichkeit, Dateiberechtigungen in SVN zu speichern.

Sowohl asvn als auch the patch aus diesem Blogpost scheinen auf (und gehostet auf dem offiziellen SVN-Repository) zu sein, und das ist eine gute Sache, aber ich denke nicht, dass sie solche Metadatenbehandlung in der Kernversion jederzeit haben bald.

SVN hatte die Fähigkeit, symbolic links und executables speziell für eine lange Zeit zu behandeln, aber beide funktionieren nicht ordnungsgemäß auf Win32. Ich würde nicht den Atem anhalten für eine andere solche nicht-portable Funktion (obwohl es nicht zu schwer wäre, auf das bereits vorhandene Metadatensystem zu implementieren.)

Ich würde in Erwägung ziehen, ein Shell-Skript zu schreiben, um die Datei manuell anzupassen Berechtigungen, und legen Sie sie dann im Repository ab.

+0

Die offizielle Version von asvn (ab sofort) scheint nicht Um mit einer großen Anzahl von ignorierten Dateien im Arbeitsverzeichnis umzugehen (es hat sehr laute Ausgabe), hier ist ein Patch, der http://mail-archives.apache.org/mod_mbox/subversion-dev/201005.mbox/%3C4BE1A4F0 korrigiert. [email protected]%3E; aus irgendeinem Grund ist es immer noch nicht in den Mainline-Repo gegangen. – Nickolay

+0

Der obige asvn-Link wurde geändert in: [asvn] (https://svn.apache.org/repos/ asf/subversion/trunk/contrib/client-side/asvn) Und nachdem ich die oben genannten Leads verfolgt habe, habe ich einige Alternativen gefunden, die vielleicht besser funktionieren: [http://fsvs.tigris.org/](http://fsvs.tigris .org /) und möglicherweise: [https://trac.dass-it.de/pub/wiki/dasscm] (https://trac.dass-it.de/pub/wiki/dasscm) –

36

SVN hat die Fähigkeit, Metadaten (properties) zusammen mit einer Datei zu speichern.Die Eigenschaften sind im Grunde genommen nur Schlüssel/Wert-Paare, jedoch gibt es einige spezielle Schlüssel wie 'svn: executable'. Wenn diese Eigenschaft für eine Datei existiert, wird Subversion das ausführbare Bit des Dateisystems für diese Datei setzen, wenn die Datei ausgecheckt wird. Während ich weiß, dass dies nicht genau das ist, wonach du suchst, könnte es einfach genug sein (war für mich).

Es gibt andere Eigenschaften für Zeilenende (svn: eol-style) und Mime-Typ (svn: mime-type).

+2

Ich habe aus Versehen stimmte das seit es war ein Link zur Originaldokumentation Aber ich wünschte, ich könnte zurückziehen, da diese Antwort zu implizieren scheint, dass Lese-/Schreibrechte für Dateien auf diese Weise gesetzt werden können. – MarkHu

1

@morechilli:

Die ASVN Wrapper von meinem früheren Post und der Blog in der Post scheint der OP zu tun, was Sie vorschlagen. Es speichert jedoch die Berechtigungen in den Repository-Eigenschaften der entsprechenden Dateien im Gegensatz zu einer einzelnen externen Datei.

3

This ist der aktualisierte Link für den SVN-Patch, der die Dateiberechtigungen im Unix-Stil korrekt behandelt. Ich habe auf fedora12 getestet und scheint zu funktionieren wie erwartet:

Ich habe es nur/usr/bin/asvn gespeichert und asvn anstelle von svn Befehl verwenden, wenn ich Berechtigungen korrekt behandelt werden muss.

+0

Scheint auch auf ubuntu 12.04 zu funktionieren. Beachten Sie jedoch, dass beim Aktualisieren Ihrer Sandbox, wenn sich Dateien im Repository mit Berechtigungen oder Gruppeninformationen befinden, für die Sie keine Rechte haben (z. B. weil Sie sie mit sudo erstellt oder aktualisiert haben), die Prozedur, mit der diese Berechtigungen festgelegt werden Möglicherweise wird der ursprüngliche Arbeitsbereich, der zuletzt ausgeführt wurde, nicht reproduziert, es sei denn, Sie führen Folgendes aus: ** sudo ** asvn update. –

1

Ich würde empfehlen, Berechtigungen Map mit mtree Dienstprogramm (FreeBSD hat es standardmäßig) zu erstellen, speichern Sie die Karte im Repository, und, wie oben erwähnt, ein Skript ausführen, die ordnungsgemäße Dateiberechtigungen aus der Karte als wiederherstellen würde erster Schritt des Build-Prozesses.

3

Viele Antworten haben angegeben, dass svn Dateiberechtigungen nicht speichert. Das mag richtig sein, aber ich war in der Lage eine DLL-Datei zu lösen, ohne Problem Berechtigungen zum Ausführen einfach durch diese Schritte:

  1. chmod 755 badpermission.dll
  2. mv badpermission.dll ../
  3. svn update
  4. svn rm badpermission.dll
  5. svn commit badpermission.dll -m "entfernen dll Berechtigungen zu beheben"
  6. mv ../badpermission.dll.
  7. svn add badpermission.dll
  8. svn commit badpermission.dll -m "die DLL hinzufügen zurück Berechtigungen zu reparieren"
  9. rm badpermission.dll
  10. svn update
  11. badpermission.dll kommt zurück mit Berechtigungen ausführen
+5

Während das oben genannte fast funktioniert, ist es sicherlich weniger effizient als einfach 'svn propset svn: executable ON your-pesky-file.ext' laufen zu lassen, das es seit Jahren gibt (es war der erste Treffer auf dem https: // www. google.com/search?q=svn+chmod search.) Ich sage fast, weil das Entfernen von Gruppenschreibberechtigungen in der Eröffnung 'chmod 755' nicht" klebt ". Sie könnten denken, dass es in Ihrer lokalen Sandbox funktioniert, aber versuchen Sie es erneut mit der Datei, und Sie werden sehen, dass SVN g + w gesetzt hat. – MarkHu

4

Da dies in früheren Antworten noch nicht vollständig gesagt wurde. Ich hasse es jedoch, Zombie-Threads wiederzubeleben.

Da für SVN Erlaubnis Unterstützung Hinzufügen von mehreren Betriebssystemen und Berechtigungstypen, NFS, POSIX, Arwed und RACF

aufnehmen müßte Dies würde SVN aufgebläht, möglicherweise mit widersprüchlichen Berechtigungstypen wie NFS und POSIX kollidieren, oder Öffnen Sie mögliche Exploits/Sicherheitslücken.

Es gibt einige Problemumgehungen. Pre-Commit, Post-Commit, Start-Commit sind die am häufigsten verwendeten und sind ein Teil des Subversion-Systems. Aber können Sie die Berechtigungen mit was auch immer Programmiersprache Sie mögen steuern.

Das System, das ich implementiere, nenne ich einen Packager, der die festgeschriebenen Dateien der Arbeitskopie validiert und dann eine Metadatendatei analysiert, die die für Dateien/Ordner gewünschten Standardberechtigungen auflistet, sowie alle Änderungen an ihnen Verlangen.

Owner, Group, Folders, Files 
default: <user> www-user 750 640 
/path/to/file: <user> non-www 770 770 
/path/to/file2: <user> <user> 700 700 

Sie auch auf diese und lassen Sie Dinge wie automatisierte Bewegungs erweitern können, sie umbenennen, von Typen, wie Alpha-, Beta-, Release Candidate, lassen

Soweit Kunden unterstützen Tagging Revision Ihre zur Kasse Repository-Dateien mit an sie angehängten Berechtigungen. Sie sollten besser einen Installer Ihres Pakets erstellen und dieses als Ressource anbieten.

Menschen Stellen Sie sich ihre Repositories mit einer ausführbaren Datei in es gesetzt mit Berechtigungen von root Einstellung: www-user 4777