2015-05-01 5 views
8

Aus irgendeinem Grund hat niemand jemals anständige svn:ignore Eigenschaften in unserem Repository eingerichtet, und als ich danach fragte war die Antwort "niemand hat sich darüber beschwert, können Sie nicht nur "nicht versionierte Artikel" nicht aktivieren? " (Wir verwenden TortoiseSVN ziemlich global).Bestimmte Verzeichnisse oder Dateien ignorieren, ohne svn: ignore

Ich bin neu im Team, also möchte ich einige lokale Ignorierlisten einrichten, anstatt Änderungen am Repository vorzunehmen.

Ich weiß über die globale Ignorierliste, aber the global ignore list does not accept specific paths, nur einfache einstufige Dateimuster. Ich lese eine question about a local ignore list, aber diese Frage fragt eigentlich nicht nach "Ignorieren" nicht versionierte Dateien, sondern fragt tatsächlich über das Blockieren von Commits für bestimmte versionierte Dateien. Ich lese ein anderes question about ignoring a directory locally wie ich möchte, aber die akzeptierte Antwort auf diese Frage verwendet die globale Ignorierliste, die für mich nicht funktioniert, weil ich nicht in der Lage bin, bestimmte Pfade in meiner Arbeitskopie anzugeben.

Ich kann einige svn:ignore Eigenschaften lokal festlegen, aber Verzeichnisse können nicht zu Änderungslisten hinzugefügt werden (wie in der obigen Frage zur Vermeidung von Commits von versionierten Dateien empfohlen), sodass ich riskiere, diese Änderungen versehentlich zu bestätigen.

Gibt es eine Möglichkeit, bestimmte unversionierte Verzeichnisse oder Dateien in meiner Arbeitskopiebaumstruktur lokal zu ignorieren, ohne svn:ignore zu verwenden?


Update: Die aktuelle Top-Antwort wird mir sehr nahe, was ich will. Es erlaubt mir, beliebige Dateien in den Dialogen "Auf Änderungen prüfen" oder "Bestätigen" herauszufiltern. Wenn ich jedoch Verzeichnis Änderungen (dh Änderungen an den versionierten Eigenschaften eines Verzeichnisses) einbeziehen möchte, dann fügt TortoiseSVN automatisch alle Dateien unter dem Verzeichnis ein (dh ich kann nicht beide Verzeichnisse in die Liste aufnehmen, und herausfiltern Dateien unter dem Verzeichnis).

Antwort

5

Ich konnte keinen nahtlosen Weg finden, um das zu erreichen, wonach Sie suchen, aber ich habe eine Option gefunden, die Ihren Anforderungen entspricht, da dies nur für Ihren lokalen Computer gedacht ist.

Es ist möglich, manuell die TortoiseSVN-Dialog aufrufen, die Pfade bietet es nach Dateien zu suchen zu begehen, wie folgt aus:

C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe /command:commit /pathfile:"<a file containing paths>" 

Also, da Sie wissen, welche Verzeichnisse & Dateien, die Sie ignorieren möchten, Sie könnten eine Pfaddatei mit den Verzeichnissen & bereitstellen, die Sie übertragen möchten.

Beachten Sie, dass die Pfaddatei in UTF-16 (little-endian) codiert sein muss, ohne die BOM. Pfade werden durch neue Zeilenzeichen getrennt. Sie können eine solche gültige Pfade Datei (in C#), wie folgt erstellen:

string[] paths = { @"c:\code\1\dir1", @"c:\code\1\dir2", @"c:\code\1\dir3\file1.txt" }; 
UnicodeEncoding encoding = new UnicodeEncoding(false, false); 
System.IO.File.WriteAllText(@"C:\temp\pathslist.txt", string.Join("\n", paths), encoding); 

In meinem Experimentieren mit den Pfaden, die beide Verzeichnis- und Dateipfade unterstützt werden, aber keine Platzhalter, so würde jede Filterung werden müssen getan zu dem Zeitpunkt, zu dem Sie die Pfaddatei erstellen.

Es gibt einige zusätzliche Befehlszeilenoptionen für TortoiseProc /command:commit, die Sie unter here finden können.

Die gleiche Methode funktioniert für "Auf Änderungen prüfen", wobei /command:repostatus statt /command:commit ersetzt wird. Zusammengefasst:

  1. Erstellen Sie ein Skript, das alle Dateinamen von Interesse packt
  2. Filter aus alle Dateinamen, die nicht interessant sind (möglicherweise von einem „ignorieren Datei“ irgendwo auf Ihrem Computer).
  3. Schreiben Sie die Liste der Dateien im UTF-16 LE-Format (ohne BOM).
  4. Rufen Sie TortoiseProc mit einem -Argument auf, das die Dateiliste angibt, und /command entweder repostatus oder commit.
  5. Löschen Sie optional die Dateiliste.

Optional - Integration mit „Commit“ mit einem Hook-Skript

Als Nebenwirkung habe ich einen Weg der „Integration“ finden durch Verwendung der TortoiseSVN Hook-Skript-Optionen in den Einstellungen machen . Es verwendet weiterhin die oben beschriebene TortoiseProc-Prozedur, bietet aber zusätzlich eine Möglichkeit, das TortoiseSVN Commit-Kontextmenü (mit einer Eigenart) weiterhin zu verwenden.

Die spezielle Sprache, die Sie für das Hook-Skript verwenden, ist nicht wichtig. Es kann nur Befehlszeilenargumente verarbeiten und einen Beendigungscode zurückgeben. Aus der Dokumentation (here):

Dies könnte eine Batch-Datei, eine ausführbare Datei oder eine andere Datei sein, die eine gültige Windows Dateiverknüpfung, z.B. ein Perl-Skript.

Für dieses Beispiel I C# verwendet:

static void Main(string[] args) 
{ 
    // Process the three command-line arguments 
    string PATH = args[0] 
     , MESSAGEFILE = args[1] 
     , CWD = args[2]; 

    const string tortoiseProcPath = @"C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe"; 
    const string someArgForOurUse = @"/2E040D90-E3AD-4AC5-AA46-E6D9F1034E55"; 
    const string wantedPathsFile = @"C:\temp\svn_paths_list.txt"; 

    //System.Diagnostics.Debugger.Launch(); 

    System.Diagnostics.Process parentProc = ParentProcessUtilities.GetParentProcess(); 

    // If the parent process isn't what is expected or it has the proprietary argument then exit. 
    if ((parentProc == null) || (!parentProc.MainModule.FileName.Equals(tortoiseProcPath, StringComparison.InvariantCultureIgnoreCase)) 
     || GetProcessCommandLine(parentProc.Id).Contains(someArgForOurUse)) 
     return; 

    // Read all selected path from passed-in the temp file 
    // Each line contains a file/directory selected in Explorer 
    string[] fileLines = System.IO.File.ReadAllLines(PATH); 
    IEnumerable<string> wantedPaths = GetWantedPaths(fileLines); 

    UnicodeEncoding encoding = new UnicodeEncoding(false, false); 
    System.IO.File.WriteAllText(wantedPathsFile, string.Join("\n", wantedPaths), encoding); 

    System.Diagnostics.Process.Start(tortoiseProcPath, "/command:commit /pathfile:\"" + wantedPathsFile + "\" " + someArgForOurUse); 

    Console.Error.WriteLine("Don't worry. Everything will be ok."); 
    Environment.Exit(1); 
} 

private static IEnumerable<string> GetWantedPaths(string[] selectedPaths) 
{ 
    // Do whatever you want here to filter directories and files 
    return selectedPaths; 
} 

// Add System.Management reference 
private static string GetProcessCommandLine(int processId) 
{ 
    System.Management.SelectQuery wmiQuery = new System.Management.SelectQuery("SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + processId.ToString()); 
    System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher(wmiQuery); 

    foreach (System.Management.ManagementObject obj in searcher.Get()) 
     return obj["CommandLine"].ToString(); 
    return null; 
} 

Der Kürze halber ParentProcessUtilities.GetParentProcess, die ich von einem anderen SO Post verwendet wird, kann here finden.

Erläuterung:

Die PATH-Eingabeargument verweist auf eine temporäre Datei, die im Explorer ausgewählt alle Verzeichnisse und Dateien enthält. Daraus können Sie Ihre Liste der gewünschten Pfade erstellen. Wenn die Liste erstellt und in eine Datei geschrieben wurde, starten wir TortoiseProc neu und übergeben die neue Datei als Argument sowie ein proprietäres Argument, das für das Tracking verwendet werden kann.

Am Ende geben wir einen anderen Exit-Code als 0 zurück, der verhindert, dass das ursprüngliche TortoiseSVN Commit-Fenster mit einem Vorbehalt angezeigt wird. Ein "Fehler" -Dialog wird angezeigt, der die in stderr geschriebene Nachricht anzeigt; die Eigenart, von der ich sprach. Einer der wichtigsten Teile dieses Codes ist das Überprüfen des übergeordneten Prozesses auf das proprietäre Argument, bevor diese Arbeit tatsächlich ausgeführt wird. Diese Prüfung verhindert, dass der Hook unendlich oft ausgeführt wird. Wenn TortoiseProc durch den obigen Code erneut gestartet wird, wird das Hook-Skript erneut ausgelöst und ruft anschließend diesen Code erneut auf.

Ich habe auch untersucht, ob der ursprünglich übergebene Inhalt der PATH-Datei nur an Ort und Stelle geändert werden kann, aber nicht. Es ist leider nur eine Datei, die TortoiseSVN explizit für den Zweck des Hook-Skripts ausgibt und dann löscht.Vielleicht könnte dies eine zukünftige Funktion sein.

+0

Dies scheint vielversprechend, wenn ich die Pfadliste on-the-fly per Skript erstellen, könnte ich eine separate Ignorierdatei für das Skript zum Ausschließen bestimmter Pfade verwenden. Es würde mich interessieren zu hören, wie dies mit einem Commit Hook integriert werden könnte. – Ben

+0

Hmm, darüber nachdenken, mein Hauptproblem war mit dem "Check for Modifications" -Dialog. Ich könnte versuchen, diese Lösung für diesen Bereich zu erkunden, aber es sieht so aus, als würde es ein benutzerdefiniertes Skript benötigen, um den Dialog zu starten, da es anscheinend keine Haken für "Nach Änderungen suchen" gibt. – Ben

+0

Richtig, es gibt keine Möglichkeit, "nach Änderungen zu suchen", wie es bei "commit" möglich ist. Wenn Sie jedoch die benutzerdefinierte Skriptroute untersuchen möchten, können Sie "/ command: commit" durch "/ command: repostatus" ersetzen, um "Check for modiciations" anzuzeigen. Beide Befehle verwenden das Argument/pathfile, um zu bestimmen, welche Dateien angezeigt werden sollen. – cokeman19