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:
- Erstellen Sie ein Skript, das alle Dateinamen von Interesse packt
- Filter aus alle Dateinamen, die nicht interessant sind (möglicherweise von einem „ignorieren Datei“ irgendwo auf Ihrem Computer).
- Schreiben Sie die Liste der Dateien im UTF-16 LE-Format (ohne BOM).
- Rufen Sie TortoiseProc mit einem -Argument auf, das die Dateiliste angibt, und
/command
entweder repostatus oder commit.
- 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.
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
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
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