SVN: Existe-t-il un moyen de marquer un fichier comme «ne pas valider»?


153

Avec TortoiseSVN, je peux déplacer un fichier dans la liste des modifications ignore-on-commit, de sorte que lorsque je valide un arbre entier, les modifications apportées à ce fichier ne sont pas validées.

Existe-t-il un moyen de faire quelque chose comme ça en utilisant l'outil de ligne de commande svn?

EDIT: Merci pour les suggestions à utiliser svn:ignore, mais cela ne fait pas tout à fait ce que je recherchais.

svn:ignoreaffecte des choses comme svn add& svn import. Il lui donne une liste de modèles de noms de fichiers à ignorer.

J'ai un fichier qui est déjà sous contrôle de code source, mais je souhaite apporter des modifications temporaires à ce fichier que je ne souhaite pas valider plus tard lorsque je valide l'ensemble de l'arborescence des sources. Je fais beaucoup d'autres changements et je pourrais coller une note sur mon moniteur pour me dire de restaurer ce fichier avant de valider l'arborescence, mais ce serait bien si svn pouvait automatiquement ignorer ce fichier.


1
Il existe un moyen d'utiliser la branche personnelle et le statut du commutateur. [Voir mon autre article sur ce sujet.] [1] [1]: stackoverflow.com/questions/862950/…
ptitpion

Réponses:


120

Subversion n'a pas de fonction intégrée «ne pas valider» / «ignorer lors de la validation», depuis février 2016 / version 1.9. Cette réponse est une solution de contournement de ligne de commande non idéale

Comme le déclare l'OP, TortoiseSVN a une liste de modifications intégrée, "ignore-on-commit", qui est automatiquement exclue des validations. Le client de ligne de commande n'a pas cela, vous devez donc utiliser plusieurs listes de modifications pour accomplir ce même comportement (avec des mises en garde) :

  • un pour le travail que vous souhaitez engager [travail]
  • un pour les choses que vous voulez ignorer [ignore-on-commit]

Puisqu'il y a un précédent avec TortoiseSVN, j'utilise "ignore-on-commit" dans mes exemples pour les fichiers que je ne veux pas valider. J'utiliserai «travail» pour les fichiers que je fais, mais vous pouvez choisir le nom que vous voulez.

Tout d'abord, ajoutez tous les fichiers à une liste de modifications nommée "work". Cela doit être exécuté à partir de la racine de votre copie de travail:

svn cl work . -R

Cela ajoutera récursivement tous les fichiers de la copie de travail à la liste de modifications nommée "work". Il y a un inconvénient à cela: comme de nouveaux fichiers sont ajoutés à la copie de travail, vous devrez ajouter spécifiquement les nouveaux fichiers ou ils ne seront pas inclus. Deuxièmement, si vous devez l'exécuter à nouveau, vous devrez alors ajouter à nouveau tous vos fichiers "Ignorer lors de la validation". Pas idéal - vous pouvez commencer à maintenir votre propre liste «ignorer» dans un fichier comme d'autres l'ont fait.

Ensuite, pour les fichiers que vous souhaitez exclure:

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

Étant donné que les fichiers ne peuvent être que dans une seule liste de modifications, exécuter cet ajout après votre précédent ajout de «travail» supprimera le fichier que vous voulez ignorer de la liste de modifications «travail» et le placera dans la liste de modifications «ignorer lors de la validation».

Lorsque vous êtes prêt à valider les fichiers modifiés que vous souhaitez valider, vous ajoutez simplement "--cl work" à votre validation:

svn commit --cl work -m "message"

Voici à quoi ressemble un exemple simple sur ma machine:

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.

Une alternative serait d'ajouter simplement chaque fichier que vous souhaitez engager à une liste de modifications «de travail», et même de ne pas maintenir une liste d'ignorance, mais c'est aussi beaucoup de travail. Vraiment, la seule solution simple et idéale est de savoir si / quand cela sera implémenté dans SVN lui-même. Il y a un problème de longue date à ce sujet dans le suivi des problèmes de Subversion, SVN-2858 , au cas où cela changerait à l'avenir.


1
J'ai ajouté deux fichiers avec la commande que vous avez mentionnée: $svn st --- Changelist 'ignore-on-commit': M database.php M config.php et pourtant, ils ont été envoyés au dépôt lors de la validation. Une idée de ce que j'ai fait de mal?
Attila Fulop

7
L'ajout de fichiers à la liste de modifications 'ignore-on-commit' n'empêche pas en soi la validation des fichiers. TortoiseSVN (un client Windows GUI) a construit en respectant "ignore-on-commit", mais pas svn en ligne de commande. La seule suggestion que j'avais dans ma réponse initiale était d'ajouter les fichiers que vous souhaitez valider dans une liste de modifications et de lui dire de le valider
Joshua McKinnon

7
ignore-on-commit est définitivement une liste réservée Tortoise. Tout ce qu'il fait est d'empêcher les éléments d'être vérifiés dans l'interface graphique par défaut, c'est donc une fonctionnalité spécifique à l'interface graphique Tortoise. Vous n'avez pas non plus besoin d'utiliser la ligne de commande pour ajouter à la liste si vous utilisez l'interface graphique. Juste un menu contextuel sur les éléments de la liste de validation et en bas, vous pouvez les déplacer vers une liste de modifications et ignorer lors de la validation est déjà défini. tortoisesvn.net/docs/release/TortoiseSVN_en/…
tjmoore

cela n'a pas fait jack. il a tout commis.
ahnbizcad

Ne fonctionne pas, la question était spécifiquement posée sur une solution de ligne de commande, pas sur l'interface graphique.
riv

26

Je me suis toujours trouvé dans cette situation aussi: et ne changelists travaille pas pour moi - je veux faire une courte liste des fichiers que je ne veux engager, plutôt que de maintenir une liste massive de fichiers que je fais défaut S'engager!

Je travaille sur la ligne de commande linux: ma solution est donc de créer un script / usr / bin / svnn (oui, avec deux 'n's!) Comme suit:

#! /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 "$@"

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

De toute évidence, cela est adapté à ma situation - mais changez simplement DIR et IGNORE_FILES en fonction de votre configuration de développement. N'oubliez pas de changer le script en exécutable avec:

sudo chmod +x /usr/bin/svnn

.. puis vous utilisez simplement "svnn" au lieu de "svn" pour exécuter subversion sans craindre de vérifier les changements locaux dans les fichiers de la liste IGNORE_FILES. J'espère que ça aide!


Enfin, cette réponse est en fait juste. Vous devez écrire un outil. C'est en fait imparfait, car je veux avoir une option dynamique, comme svnn ignore configs/*- avec des caractères génériques, des cloches et des sifflets. Je pense que j'écris quelque chose comme ça moi-même, puis je reviens ici!
Tomasz Gandor

c'est bien! Mieux encore, créez un alias dans .bashrc pour svn -> svnn. Mieux encore, au lieu de spécifier les fichiers à ignorer dans la commande, il pourrait se comporter comme git, il vérifierait un fichier .ignore dans le dossier et ignorerait chaque fichier qui correspond au modèle.
Tarek le

Au lieu d'avoir à réapprendre la saisie svnn, envisagez de l'appeler svnet de placer ce script dans quelque chose qui peut être au début de votre PATH, tel que ${HOME}/bin. À partir du script lui-même, vous appelleriez alors /usr/bin/svn.
Joost

17

Je ne crois pas qu'il existe un moyen d'ignorer un fichier dans le référentiel. Nous rencontrons souvent cela avec web.config et d'autres fichiers de configuration.

Bien que pas parfaite, la solution que je vois et utilise le plus souvent est d'avoir un fichier .default et une tâche nante pour créer des copies locales.

Par exemple, dans le référentiel se trouve un fichier appelé web.config.defaultqui a des valeurs par défaut. Ensuite, créez une tâche nant qui renommera tous les web.config.defaultfichiers enweb.config qui peut ensuite être personnalisée aux valeurs locales. Cette tâche doit être appelée lorsqu'une nouvelle copie de travail est récupérée ou qu'une génération est exécutée.

Vous devrez également ignorer le web.configfichier créé afin qu'il ne soit pas validé dans le référentiel.


8

Consultez les listes de modifications , qui peuvent vous fournir une option pour filtrer les fichiers que vous avez modifiés mais que vous ne souhaitez pas valider. SVN ne sautera pas automatiquement un fichier à moins que vous ne le lui disiez - et la façon dont vous lui dites que ce fichier est en quelque sorte différent des autres fichiers est de le mettre dans une liste de modifications.

Cela demande plus de travail pour vous, et vous ne pouvez appliquer la liste de modifications qu'à votre copie de travail (évidemment, imaginez le chaos qui pourrait s'ensuivre si vous pouviez appliquer une propriété «ne jamais mettre à jour» à une révision!).


1
Mais c'est exactement ce que nous voulons. Par exemple, un fichier source dont vous avez besoin pour définir un defaultUserId = yourId, au lieu de la valeur par défaut du système.
orbfish

4

Je suis venu à ce fil à la recherche d'un moyen de faire un commit "atomique" de seulement quelques fichiers et au lieu d'ignorer certains fichiers lors du commit, je suis allé dans l'autre sens et je n'ai commis que les fichiers que je voulais:

svn ci filename1 filename2

Peut-être que cela aidera quelqu'un.


Votre réponse n'est qu'une suggestion adéquate dans ce fil. svn ciest simplement un alias de svn commit. La commande Commit permet de faire un commit particulier des fichiers spécifiés
oxfn

3

Les gars, je viens de trouver une solution. Étant donné que TortoiseSVN fonctionne comme nous le souhaitons, j'ai essayé de l'installer sous Linux - ce qui signifie qu'il fonctionne sous Wine. Étonnamment, cela fonctionne! Tout ce que tu dois faire est:

  1. Ajoutez les fichiers que vous voulez ignorer en exécutant: "svn changelist 'ignore-on-commit'".
  2. Utilisez TortoiseSVN pour valider: "~ / .wine / drive_c / Program \ Files / TortoiseSVN / bin / TortoiseProc.exe / command: commit / path: '
  3. Les fichiers exclus seront décochés pour la validation par défaut, tandis que les autres fichiers modifiés seront vérifiés. C'est exactement la même chose que sous Windows. Prendre plaisir!

(La raison pour laquelle il est nécessaire d'exclure des fichiers par CLI est que l'entrée de menu pour faire cela n'a pas été trouvée, je ne sais pas pourquoi. De toute façon, cela fonctionne très bien!)


2

Les fichiers en conflit ne peuvent pas être validés. Vous pouvez en profiter pour garder vos modifications privées hors du référentiel. Cela fonctionne mieux avec un petit nombre de fichiers.

Pour obtenir un conflit pour a-file, votre copie de travail (WC) n'a pas la mise à jour a-filedu référentiel, et que a-filedans votre WC a des modifications qui se trouvent au même emplacement que les modifications dans le référentiel (modifications que vous n'avez pas mises à jour encore). Si vous ne voulez pas attendre les conditions ci-dessus, vous pouvez créer un conflit a-filecomme celui-ci:
Dans la copie de travail 1 (WC1), ajoutez une ligne de texte en haut de a-file, telle que «créer un conflit ici» . Utilisez la syntaxe nécessaire pour ne pas casser le référentiel. Commit à a-filepartir de WC1. Dans WC2, ajoutez une ligne de texte différente en haut de a-file, comme "je veux un conflit" . Mettez à jour à partir de WC2, et maintenant un fichier doit être en conflit.


1

J'écrirais plutôt un script d'aide bash qui s'exécute svn commitsur tous les fichiers dont vous avez besoin et sur aucun de ceux dont vous n'avez pas besoin. De cette façon, vous avez beaucoup plus de contrôle.

Par exemple, avec une seule ligne, vous pouvez valider tous les fichiers avec l'extension .het .cppauxquels vous avez apporté des modifications (et qui ne provoqueraient pas de conflit):

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

Modifiez / ajoutez des extensions à la [h|cpp]pièce. Ajoutez un message de journal entre les guillemets de -m ""si nécessaire.


1

Certaines des idées proposées peuvent être mises en œuvre comme ceci:

Sous Windows dans PowerShell

tout ajouter à la liste par défaut.ps1

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

ajouter à ignorer list.ps1

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

Désormais, vous pouvez créer svn ci --changelist defaultun alias afin de ne pas avoir à le spécifier à chaque fois. L'avantage supplémentaire est que vous pouvez stocker la liste Ignorer lors de la validation (si vous le souhaitez) dans le référentiel.

Je fais cela pour certains fichiers qui sont constamment régénérés mais rarement modifiés à la main. Par exemple, j'ajoute un numéro de révision à mes fichiers de configuration sur des espaces réservés spécifiques afin que les fichiers soient modifiés à chaque commit, mais le changement manuel est rare.


1

J'étais fatigué d'attendre que cela soit intégré à SVN. J'utilisais tortoiseSVN avec ignore-on-commit, mais cela fait apparaître une boîte de dialogue utilisateur que vous ne pouvez pas supprimer de la ligne de commande, et quand je lance mon script de construction et que je vais préparer une tasse de thé, je déteste quand Je reviens pour découvrir qu'il attend l'entrée de l'utilisateur 10% du chemin.

Voici donc un script Windows PowerShell qui valide uniquement les fichiers qui ne sont pas dans une liste de modifications:

# 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

Mise à jour du script de user88044.

L'idée est de pousser les fichiers dans la liste des modifications à ne pas valider et d'exécuter le script diabolique.

Le script extrait les fichiers do-not-commit de la commande: svn status --changelist 'do-not-commit'

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

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

pour i dans $ IGNORE_FILES; faire mv $ DIR / $ i $ DIR / "$ i" _; terminé;

svn "$ @";

pour i dans $ IGNORE_FILES; faire mv $ DIR / "$ i" _ $ DIR / $ i; terminé;

Le script est placé dans / usr / bin / svnn (sudo chmod + x / usr / bin / svnn)

statut svnn, svnn commit, etc ...


1

Vous pouvez configurer la liste de modifications "ignore-on-commit" directement avec TortoiseSVN. Pas besoin de configurer une autre liste de modifications, y compris tous les autres fichiers

1) Cliquez sur "SVN Commit ..." (nous n'engagerons pas, juste un moyen de trouver un menu graphique pour la liste des modifications) 2) Dans la liste, faites un clic droit sur le fichier que vous souhaitez exclure. 3) Menu: passer à la liste des modifications> ignorer lors de la validation

La prochaine fois que vous ferez un SVN Commit ... Les fichiers apparaîtront décochés à la fin de la liste, sous la catégorie ignore-on-commit.

Testé avec: TortoiseSVN 1.8.7, Build 25475 - 64 Bit, 05/05/2014 20:52:12, Subversion 1.8.9, -release


1
youps, je viens de voir les commentaires de tjmoore, donnant déjà la bonne info pour l'utilisateur tortoiseSVN ... pas de ligne de commande tortoisesvn.net/docs/release/TortoiseSVN_en/…
luney

Est-ce cassé dans 1.9?
Jake Hm

1

C'est tard dans le jeu, mais j'ai trouvé la commande de ligne de commande la plus impressionnante pour ce problème. Fait avec bash. Prendre plaisir.

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

Ok, alors voici une explication de la commande. Certaines choses devront être modifiées en fonction de votre cas d'utilisation.

svn status

J'obtiens une liste de tous les fichiers. Ils commenceront tous par ces caractères d'état (?,!, A, etc.). Chacun a ses propres lignes

grep -v excluding

J'utilise grep pour filtrer la liste. Il peut être utilisé normalement (pour inclure) ou avec l'option -v (pour exclure). Dans ce cas, il est utilisé pour exclure, avec une phrase "excluant" ce qui sera exclu.

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

Maintenant, je supprime le caractère de statut et les espaces au début de chaque ligne, puis je cite chaque ligne, en utilisant sed. Certains de mes noms de fichiers contiennent des espaces, d'où la citation.

tr '\n' ' '

En utilisant tr, je remplace toutes les nouvelles lignes par des espaces. Maintenant, toute ma liste de fichiers à valider est sur une seule ligne.

xargs svn commit -m "My Message"

Enfin, j'utilise xargs pour exécuter ma commande de validation avec le message. Il effectue la validation et supprime ma liste de fichiers citée comme dernier argument.

Le résultat est que tout fonctionne finalement comme je le souhaite. Je déteste encore un peu svn pour m'avoir forcé à sauter à travers ces foutus cerceaux, mais je peux vivre avec ça. J'imagine.


0

Comme je faisais face au même problème et que ma recherche sur Google ne me donnait rien, je pense avoir trouvé une solution de contournement. Voici ce que j'ai fait, cela semble fonctionner pour moi, mais comme je suis coincé avec une ancienne version de SVN (<1.5, car il n'a pas l'option --keep-local) et je n'en suis pas un expert , Je ne peux pas être sûr que ce soit une solution universelle. Si cela fonctionne pour vous aussi, faites-le moi savoir!

J'avais affaire à une installation Prestashop que j'avais obtenue de SVN, car d'autres personnes avaient déjà commencé à y travailler. Puisque les paramètres de la base de données ont été définis pour un autre serveur, je les ai modifiés dans un fichier du dossier / config. Comme ce dossier était déjà versionné, le définir dans svn: ignore n'empêcherait pas mes modifications locales d'être validées. Voici ce que j'ai fait:

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)

Maintenant, je peux exécuter svn add --force. à la racine du repo sans ajouter ma configuration, même si elle ne correspond pas à la version du repo (je suppose que je devrais revoir tout cela si je la modifiais une fois de plus, ne testais pas). Je peux également mettre à jour svn sans que mes fichiers ne soient écrasés ou n'obtiennent aucune erreur.


0

Une solution qui n'ignore pas les modifications des propriétés du répertoire

J'ai essayé d'utiliser la solution basée sur changelist, mais j'ai quelques problèmes avec elle. Tout d'abord, mon référentiel contient des milliers de fichiers, donc la liste des modifications à valider est énorme et ma svn statussortie est devenue beaucoup trop longue et devait être analysée pour être utile. Le plus important est que je souhaitais valider les modifications issues d'une fusion, ce qui signifie qu'elles incluent des modifications de propriété. Lors de la validation d'une liste de modifications, les propriétés svn attachées au répertoire ne sont pas validées, j'ai donc dû faire un commit supplémentaire:

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

Vous devrez peut-être le faire pour plusieurs répertoires (ici, j'enregistre les propriétés de DIRet du répertoire actuel .), essentiellement ceux avec un Mdans la deuxième colonne lors de l'exécution de la svn statuscommande.

Solution

J'ai utilisé des patchs et svn patch. En 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

Comme d'autres affiches, je finis par utiliser un script pour maintenir la liste des fichiers à ignorer:

#! /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 "$@"

Je l'ai généralement utilisé avec ciet revert -R ..


-1

svn:ignore est votre réponse.

Exemple:

$ svn propset svn:ignore -F .cvsignore .
property 'svn:ignore' set on '.'

1
Notez que l'exemple ci-dessus montre comment utiliser un fichier cvsignore précédemment configuré comme entrée de votre propriété svnignore.
Ben Hoffstein

1
no svn: ignore est juste pour les fichiers d'annulation de version. ne fonctionne pas avec les fichiers de version
Sérgio

1
Et ce n'est pas non plus local. C'est un changement de propriété qui sera engagé par lui-même.
Adam Badura

-9
svn propset "svn:ignore" "*.xml" .

l' *.xmlest le modèle des fichiers à ignorer; vous pouvez également utiliser des noms de répertoires ici.


3
-1 car vous ne pouvez pas ignorer un fichier qui fait partie du référentiel.
zellus
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.