it-swarm.com.de

SVN: Gibt es eine Möglichkeit, eine Datei als "Nicht verpflichten" zu markieren?

Mit TortoiseSVN kann ich eine Datei in die Änderungsliste ignore-on-commit verschieben, sodass beim Festschreiben eines ganzen Baums Änderungen an dieser Datei nicht festgeschrieben werden.

Gibt es eine Möglichkeit, so etwas mit dem Befehlszeilentool svn zu tun?

BEARBEITEN: Danke für die Vorschläge zur Verwendung von svn:ignore, aber das entspricht nicht genau dem, was ich gesucht habe.

svn:ignore beeinflusst Dinge wie svn add & svn import. Es gibt eine Liste von Dateinamensmustern, die ignoriert werden sollen.

Ich habe eine Datei, die bereits unter Quellcodeverwaltung steht, aber ich möchte vorübergehende Änderungen an dieser Datei vornehmen, die später nicht festgeschrieben werden soll, wenn ich den gesamten Quellbaum festschreibe. Ich mache viele andere Änderungen und könnte eine Notiz auf meinem Monitor anbringen, die mich auffordert, diese Datei zurückzusetzen, bevor ich den Baum festschreibe, aber es wäre schön, wenn svn diese Datei automatisch überspringen könnte.

145
Ferruccio

Subversion verfügt nicht über eine integrierte Funktion "Nicht verpflichten"/"Beim Festschreiben ignorieren" (Stand Februar 2016/Version 1.9). Diese Antwort ist eine nicht ideale Befehlszeilen-Workaround

Wie das OP sagt, hat TortoiseSVN eine eingebaute Änderungsliste, "ignore-on-commit", die automatisch von Commits ausgeschlossen wird. Der Befehlszeilenclient verfügt nicht über diese Option. Daher müssen Sie mehrere Änderungslisten verwenden, um dasselbe Verhalten (mit Vorbehalten) auszuführen.:

  • eine für die Arbeit, die Sie begehen wollen [Arbeit]
  • eine für Dinge, die Sie ignorieren möchten [beim Commit ignorieren]

Da es bei TortoiseSVN einen Präzedenzfall gibt, verwende ich in meinen Beispielen "ignore-on-commit" für die Dateien, die ich nicht festlegen möchte. Ich benutze "work" für die Dateien, die ich mache, aber Sie könnten einen beliebigen Namen auswählen.

Fügen Sie zunächst alle Dateien einer Änderungsliste mit dem Namen "work" hinzu. Dies muss vom Stammverzeichnis Ihrer Arbeitskopie ausgeführt werden:

svn cl work . -R

Dadurch werden alle Dateien in der Arbeitskopie rekursiv zur Änderungsliste mit dem Namen "Arbeit" hinzugefügt. Dies hat einen Nachteil: Da der Arbeitskopie neue Dateien hinzugefügt werden, müssen Sie die neuen Dateien spezifisch hinzufügen oder sie werden nicht hinzugefügt. Zweitens: Wenn Sie dies erneut ausführen müssen, müssen Sie alle Ihre "ignore-on-commit" -Dateien erneut hinzufügen. Nicht ideal - Sie könnten damit beginnen, Ihre eigene "Ignorieren" -Liste in einer Datei zu pflegen, wie es andere getan haben.

Dann für die Dateien, die Sie ausschließen möchten:

svn cl ignore-on-commit path\to\file-to-ignore

Da Dateien nur in einer Änderungsliste enthalten sein können, wird das Ausführen dieses Zusatzes nach dem Hinzufügen von "Arbeit" die Datei, die Sie ignorieren möchten, aus der Änderungsliste "Arbeit" entfernt und in die Änderungsliste "ignore-on-commit" gestellt.

Wenn Sie bereit sind, Ihre geänderten Dateien festzuschreiben, die Sie festschreiben möchten, fügen Sie Ihrem Commit einfach "--cl work" hinzu:

svn commit --cl work -m "message"

Ein einfaches Beispiel sieht auf meinem Rechner so aus:

D:\workspace\trunk>svn cl work . -R
Skipped '.'
Skipped 'src'
Skipped 'src\conf'
A [work] src\conf\db.properties
Skipped 'src\Java'
Skipped 'src\Java\com'
Skipped 'src\Java\com\corp'
Skipped 'src\Java\com\corp\sample'
A [work] src\Java\com\corp\sample\Main.Java
Skipped 'src\Java\com\corp\sample\controller'
A [work] src\Java\com\corp\sample\controller\Controller.Java
Skipped 'src\Java\com\corp\sample\model'
A [work] src\Java\com\corp\sample\model\Model.Java
Skipped 'src\Java\com\corp\sample\view'
A [work] src\Java\com\corp\sample\view\View.Java
Skipped 'src\resource'
A [work] src\resource\icon.ico
Skipped 'src\test'

D:\workspace\trunk>svn cl ignore-on-commit src\conf\db.properties
D [work] src\conf\db.properties
A [ignore-on-commit] src\conf\db.properties

D:\workspace\trunk>svn status

--- Changelist 'work':
        src\Java\com\corp\sample\Main.Java
        src\Java\com\corp\sample\controller\Controller.Java
        src\Java\com\corp\sample\model\Model.Java
M       src\Java\com\corp\sample\view\View.Java
        src\resource\icon.ico

--- Changelist 'ignore-on-commit':
M       src\conf\db.properties

D:\workspace\trunk>svn commit --cl work -m "fixed refresh issue"
Sending        src\Java\com\corp\sample\view\View.Java
Transmitting file data .done
Committing transaction...
Committed revision 9.

Eine Alternative wäre, einfach jede Datei, die Sie festschreiben möchten, zu einer Änderungsliste für die Arbeit hinzuzufügen und nicht einmal eine Ignorierliste zu verwalten. Dies ist jedoch auch eine Menge Arbeit. Die einzige einfache, ideale Lösung ist, wenn/wenn dies in SVN selbst implementiert wird. Im Subversion-Ausgaben-Tracker SVN-2858 gibt es eine langjährige Ausgabe, falls sich dies in der Zukunft ändert.

114
Joshua McKinnon

Ich habe mich auch immer wieder in dieser Situation wiedergefunden: und Änderungslisten funktionieren bei mir nicht - ich möchte eine kurze Liste von Dateien erstellen, die ich nicht tue wollen festschreiben, anstatt eine riesige Liste von Dateien zu führen, die ich festschreiben möchte !

Ich arbeite auf der Linux-Kommandozeile: Meine Lösung besteht darin, ein Skript/usr/bin/svnn (ja, mit zwei 'n'!) Wie folgt zu erstellen:

#! /bin/bash
DIR=/home/mike/dev/trunk

IGNORE_FILES="\
        foo/pom.xml \
        foo/src/gwt/App.gwt.xml \
        foo/src/main/Java/gwt/Common.gwt.xml \
        foo/src/main/resources/context/datasource/local.xml \
        foo/src/main/resources/context/environment/local.xml"

for i in $IGNORE_FILES; do mv $DIR/$i $DIR/"$i"_; done;

svn "[email protected]"

for i in $IGNORE_FILES; do mv $DIR/"$i"_ $DIR/$i; done;

Dies ist natürlich auf meine Situation zugeschnitten - aber ändern Sie einfach DIR und IGNORE_FILES, um es an Ihr Entwickler-Setup anzupassen. Denken Sie daran, das Skript in "ausführbar" zu ändern mit:

Sudo chmod +x /usr/bin/svnn

..dann verwenden Sie einfach "svnn" anstelle von "svn", um Subversion auszuführen, ohne befürchten zu müssen, lokale Änderungen an den Dateien in der Liste IGNORE_FILES einzuchecken. Ich hoffe das hilft!

26
user88044

Ich glaube nicht, dass es eine Möglichkeit gibt, eine Datei im Repository zu ignorieren. Wir finden das oft mit web.config und anderen Konfigurationsdateien. 

Die Lösung, die ich am häufigsten sehe und verwende, ist eine .default-Datei und eine Nant-Task zum Erstellen lokaler Kopien.

Im Repo ist beispielsweise eine Datei mit dem Namen web.config.default vorhanden, die Standardwerte hat. Erstellen Sie anschließend eine Nant-Task, die alle web.config.default-Dateien in web.config umbenennt und an lokale Werte angepasst werden kann. Diese Task sollte aufgerufen werden, wenn eine neue Arbeitskopie abgerufen oder ein Build ausgeführt wird.

Sie müssen auch die erstellte web.config-Datei ignorieren, damit sie nicht an das Repository übergeben wird.

17
Steven Lyons

Check out changelists , das Ihnen die Möglichkeit bietet, Dateien herauszufiltern, die Sie geändert haben, aber nicht festschreiben möchten. SVN überspringt eine Datei nicht automatisch, es sei denn, Sie teilen es mit. Die Art und Weise, wie diese Datei sich von anderen Dateien unterscheidet, besteht darin, sie in eine Änderungsliste aufzunehmen.

Es erfordert mehr Arbeit für Sie, und Sie können die Änderungsliste nur auf Ihre Arbeitskopie anwenden (stellen Sie sich natürlich das Chaos vor, das entstehen könnte, wenn Sie eine 'niemals aktualisierte' Eigenschaft auf eine Revision anwenden könnten!).

8
gbjbaanb

Ich kam zu diesem Thread und suchte nach einer Möglichkeit, ein "atomares" Commit von nur einigen Dateien durchzuführen. Anstatt einige Dateien beim Commit zu ignorieren, ging ich den anderen Weg und legte nur die gewünschten Dateien fest:

svn ci filename1 filename2

Vielleicht hilft es jemandem.

4
Radek

Jungs, ich habe gerade eine Lösung gefunden. Da TortoiseSVN wie gewünscht funktioniert, habe ich versucht, es unter Linux zu installieren - was bedeutet, dass es unter Wine läuft. Überraschenderweise funktioniert es! Alles was du tun musst, ist:

  1. Fügen Sie Dateien hinzu, die Sie übergehen möchten, indem Sie Folgendes ausführen: "svn changelist 'ignore-on-commit'".
  2. Verwenden Sie TortoiseSVN zum Festschreiben: "~/.wine/Laufwerk_c/Programm\Dateien/TortoiseSVN/bin/TortoiseProc.exe/Befehl: Festschreiben/Pfad: '
  3. Die ausgeschlossenen Dateien werden standardmäßig mit nicht markiert für ein Commit festgelegt, während andere modifizierte Dateien geprüft werden. Dies ist genau das gleiche wie unter Windows. Genießen!

(Der Grund, warum Dateien per CLI ausgeschlossen werden müssen, ist, dass der Menüeintrag dafür nicht gefunden wurde und nicht genau weiß, warum. In jeder Hinsicht funktioniert das großartig!)

3
James Fu

Konfliktdateien dürfen nicht festgeschrieben werden. Sie können dies nutzen, um Ihre privaten Änderungen aus dem Repository herauszuhalten. Dies funktioniert am besten mit einer kleinen Anzahl von Dateien.

Um einen Konflikt für a-file zu erhalten, verfügt Ihre Arbeitskopie (WC) nicht über den aktuellen a-file aus dem Repository, und der a-file in Ihrem WC enthält Änderungen, die sich an derselben Position befinden wie Änderungen im Repository (Änderungen, die Sie nicht vorgenommen haben Update noch nicht). Wenn Sie nicht auf die oben genannten Bedingungen warten möchten, können Sie einen Konflikt für a-file wie folgt erstellen:
Fügen Sie in Arbeitskopie 1 (WC1) oben in a-file eine Textzeile hinzu, z. B. "Hier einen Konflikt bilden". Verwenden Sie die erforderliche Syntax, um das Repository nicht zu beschädigen. Übergeben Sie a-file von WC1. Fügen Sie in WC2 oben in a-file eine andere Textzeile hinzu, beispielsweise "Ich möchte einen Konflikt". Update von WC2, und jetzt sollte eine a-Datei in Konflikt stehen. 

2
phi

Update des user88044-Skripts.

Die Idee ist, die Dateien in die Änderungsliste "Nicht zu begehen" zu verschieben und das böse Skript auszuführen.

Das Skript extrahiert die Do-not-Commit-Dateien aus dem Befehl: svn status --changelist 'do-not-commit'

#! /bin/bash DIR = "$ (pwd)"

IGNORE_FILES = "$ (svn status --changelist 'do-not-commit' | tail -n +3 | grep -oE '[^] + $')"

für i in $ IGNORE_FILES; do mv $ DIR/$ i $ DIR/"$ i" _; erledigt;

svn "$ @";

für i in $ IGNORE_FILES; do mv $ DIR/"$ i" _ $ DIR/$ i; erledigt;

Das Skript befindet sich in/usr/bin/svnn (Sudo chmod + x/usr/bin/svnn)

svnn status, svnn commit usw.

1
Nicolas F.

Ich würde stattdessen ein Helper-Bash-Skript schreiben, das svn commit für alle Dateien ausführt, die Sie benötigen, und keine der Dateien, die Sie nicht benötigen. Auf diese Weise haben Sie viel mehr Kontrolle.

Mit einer Zeile können Sie beispielsweise alle Dateien mit der Erweiterung .h und .cpp übergeben, an denen Sie Änderungen vorgenommen haben (und die keinen Konflikt verursachen):

svn commit -m "" `svn status | grep "^M.*[h|cpp]$" | awk '{print $2}' | tr "\\n" " "`

Ändern/Hinzufügen von Erweiterungen zum [h|cpp]-Teil. Fügen Sie bei Bedarf eine Protokollnachricht zwischen den Anführungszeichen von -m "" hinzu.

1
Alan Turing

Sie können die Änderungsliste "ignore-on-commit" direkt mit TortoiseSVN ..__ konfigurieren. Sie müssen keine andere Änderungsliste einschließlich aller anderen Dateien konfigurieren

1) Klicken Sie auf "SVN Commit ..." (wir werden nicht festlegen, sondern finden ein grafisches Menü für die Änderungsliste.) 2) Klicken Sie mit der rechten Maustaste auf die Datei, die Sie ausschließen möchten ) Menü: Zur Änderungsliste wechseln> Beim Commit ignorieren

Wenn Sie das nächste Mal ein SVN-Commit durchführen, werden die Dateien am Ende der Liste ungeprüft unter der Kategorie ignore-on-commit angezeigt.

Getestet mit: TortoiseSVN 1.8.7, Build 25475 - 64 Bit, 2014/05/05 20:52:12, Subversion 1.8.9, -release

1
luney

Ich habe es satt, darauf zu warten, dass dies in SVN integriert wird. Ich habe tortoiseSVN mit ignore-on-commit verwendet, aber es erscheint ein Benutzerdialogfeld, das Sie nicht von der Befehlszeile aus unterdrücken können. Wenn ich mein Build-Skript starte und eine Tasse Tee mache, hasse ich es, wenn Ich komme zurück, um zu erfahren, dass es auf Benutzereingaben 10% des Weges wartet. 

Hier ist ein Windows-Powershell-Skript, das nur Dateien festschreibt, die sich nicht in einer Änderungsliste befinden:

# get list of changed files into targets
[XML]$svnStatus = svn st -q --xml C:\SourceCode\Monad
# select the nodes that aren't in a changelist
$fileList = $svnStatus.SelectNodes('/status/target/entry[wc-status/@item != "unversioned"]') | Foreach-Object {$_.path};
# create a temp file of targets
$fileListPath =  [IO.Path]::GetTempFileName();
$fileList | out-file $fileListPath -Encoding ASCII
# do the commit
svn commit --targets $fileListPath -m "Publish $version" --keep-changelists 
# remove the temp file
Remove-Item $filelistPath
1
Ben Curthoys

Dies ist zu spät zum Spiel, aber ich habe den großartigsten Befehlszeilenbefehl für dieses Problem gefunden. Fertig mit Bash. Genießen.

svn status | grep -v excluding | sed 's/^A */"/g; s/$/"/g' | tr '\n' ' ' | xargs svn commit -m "My Message"

Ok, hier ist eine Erklärung des Befehls. Einige Dinge müssen je nach Anwendungsfall geändert werden.

svn status

Ich bekomme eine Liste aller Dateien. Sie beginnen alle mit diesen Statuszeichen (?,!, A usw.). Jeder ist auf einer eigenen Linie

grep -v excluding

Ich verwende grep, um die Liste zu filtern. Es kann entweder normal (einschließen) oder mit dem Flag -v (ausschließen) verwendet werden. In diesem Fall wird dies zum Ausschließen verwendet, wobei "Ausschluss" das ist, was ausgeschlossen wird.

sed 's/^. */"/g; s/$/"/g'

Jetzt entferne ich das Statuszeichen und den Leerraum am Anfang jeder Zeile und zitiere dann jede Zeile mit sed. Einige meiner Dateinamen enthalten Leerzeichen, daher das Zitat.

tr '\n' ' '

Mit tr ersetze ich alle Zeilenumbrüche durch Leerzeichen. Jetzt befindet sich meine gesamte Liste der zu übertragenden Dateien in einer Zeile.

xargs svn commit -m "My Message"

Zuletzt verwende ich xargs, um meinen Commit-Befehl mit der Nachricht auszuführen. Es macht das Festschreiben und löscht meine Liste der zitierten Dateien als letztes Argument.

Das Ergebnis ist, dass alles letztendlich so funktioniert, wie ich es möchte. Ich hasse es immer noch, dass ich mich durch diese gottverdammten Reifen hüpfen muss, aber ich kann damit leben. Ich vermute.

1
user2223059

Einige der vorgeschlagenen Ideen können wie folgt umgesetzt werden:

Unter Windows in PowerShell

Alles zur Standardliste hinzufügen list.ps1

dir -Recurse | ? { -not $_.PSIsContainer } | % { svn cl default $_.FullName }

Zu ignorieren list.ps1 hinzufügen

 dir file1 ... filN  % { $_.FullName } > ignore-on-commit
 cat .\ignore-on-commit | % { svn cl ignore-on-commit $_ }
 svn add ignore-on-commit

Jetzt können Sie Alias ​​svn ci --changelist default eingeben, damit Sie ihn nicht jedes Mal angeben müssen. Der zusätzliche Vorteil ist, dass Sie die Ignore-on-Commit-Liste (wenn Sie möchten) im Repository speichern können. 

Ich mache dies für einige Dateien, die ständig regeneriert werden, aber selten von Hand geändert werden. Zum Beispiel füge ich meinen Konfigurationsdateien auf bestimmten Platzhaltern eine Revisionsnummer hinzu, damit die Dateien bei jedem Commit geändert werden, manuelle Änderungen sind jedoch selten.

1
majkinetor

Da ich vor genau demselben Problem stand und mein Googeln mir immer wieder nichts gab, denke ich, dass ich eine Problemumgehung gefunden habe. Folgendes habe ich getan, es scheint für mich zu funktionieren, aber da ich mit einer alten Version von SVN (<1.5, da es nicht die Option --keep-local hat) stecke, bin ich kein Experte Ich kann nicht sicher sein, dass es eine universelle Lösung ist. Wenn es auch für Sie funktioniert, lass es mich wissen!

Ich hatte es mit einer Prestashop-Installation zu tun, die ich von SVN bekam, da bereits andere Leute daran gearbeitet hatten. Da die DB-Einstellungen für einen anderen Server vorgenommen wurden, habe ich sie in einer Datei im Ordner/config geändert. Da dieser Ordner bereits versioniert war, konnte das Festlegen des Ordners in svn: ignore nicht verhindern, dass lokale Änderungen daran übernommen werden. Folgendes habe ich getan:

cp config ../cfg_bkp              # copy the files out of the repo
svn rm config                     # delete files both from svn and "physically"
svn propset svn:ignore "config" . # as the files no longer exists, I can add my ignore rule and then...
mv ../cfg_bkp config              # ...bring'em back
svn revert --recursive config     # make svn forget any existing status for the files (they won't be up for deletion anymore)

Jetzt kann ich svn add --force ausführen. am repo-root ohne meine config hinzuzufügen, auch wenn sie nicht mit der repos-version übereinstimmt (ich denke, ich müsste das alles noch einmal durchgehen, wenn ich es noch einmal modifizierte, nicht testete). Ich kann auch svn updaten, ohne dass meine Dateien überschrieben werden oder eine Fehlermeldung angezeigt wird.

0
neemzy

Eine Lösung, die Änderungen in den Verzeichniseigenschaften nicht ignoriert

Ich habe versucht, die auf changelist basierende Lösung zu verwenden, habe jedoch einige Probleme damit. Zuerst enthält mein Repository Tausende von Dateien, daher ist die zu bezeichnende Änderungsliste sehr groß, und meine svn status-Ausgabe wurde viel zu lang und musste analysiert werden, um nützlich zu sein. Am wichtigsten ist, dass ich Änderungen vornehmen wollte, die aus einer Verschmelzung stammten, was bedeutet, dass sie Eigenschaftsänderungen enthalten. Beim Festschreiben einer Änderungsliste werden die an das Verzeichnis angehängten svn-Eigenschaften nicht festgeschrieben. Daher musste ich ein zusätzliches Commit ausführen:

svn ci --cl work -m "this commits files from the work changelist only"
svn up
svn ci --depth empty DIR . -m "record merge properties"

Möglicherweise müssen Sie dies für mehrere Verzeichnisse tun (hier notiere ich die Eigenschaften von DIR und des aktuellen dir .), im Grunde diejenigen mit einer M in der zweiten Spalte, wenn Sie den Befehl svn status ausgeben.

Lösung

Ich habe Patches und svn patch verwendet. Im Pseudo-Code:

svn diff $IGNORE_FILES > MYPATCH   # get the mods to ignore
svn patch --reverse-diff MYPATCH   # remove the mods
svn ci -m "message"                # check-in files and directory properties
svn patch MYPATCH                  # re-apply the mods

Wie andere Poster verwende ich am Ende ein Skript, um die Liste der zu ignorierenden Dateien zu verwalten:

#! /usr/bin/env bash

finish() {
    svn patch MYPATCH               # re-apply the mods
}
trap finish EXIT

IGNORE_FILES="\
sources/platform/ecmwf-cca-intel-mpi.xml \
runtime/classic/platform/ecmwf-cca.job.tmpl \
runtime/classic/platform/ecmwf-cca-intel.xml"

svn diff $IGNORE_FILES > MYPATCH # get the mods to ignore
svn patch --reverse-diff MYPATCH # remove the mods

svn "[email protected]"

Ich habe es normalerweise mit ci und revert -R . verwendet.

0
P. Le Sager