web-dev-qa-db-fra.com

SVN: Est-il possible de marquer un fichier comme "ne pas valider"?

Avec TortoiseSVN, je peux déplacer un fichier dans la liste de modifications ignore-on-commit, afin que les modifications apportées à ce fichier ne soient pas validées lorsque je commets une arborescence complète.

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

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

svn:ignore affecte 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 ultérieurement lorsque je commettrai l'intégralité de l'arborescence source. Je suis en train de faire beaucoup de changements et je pourrais coller une note sur mon moniteur m'indiquant de restaurer ce fichier avant de valider l'arbre, mais ce serait bien si svn pouvait ignorer automatiquement ce fichier.

145
Ferruccio

Subversion ne possède pas de fonctionnalité intégrée "ne pas valider"/"ignorer lors de la validation", à partir de février 2016/version 1.9. Cette réponse est une solution de contournement en ligne de commande non idéale

Comme l'indique 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 le même comportement (avec des mises en garde):

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

Puisqu'il existe un précédent avec TortoiseSVN, j'utilise "ignore-on-commit" dans mes exemples pour les fichiers que je ne souhaite pas commettre. Je vais utiliser "travail" pour les fichiers que je fais, mais vous pouvez choisir le nom de votre choix.

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 tous les fichiers de la copie de travail de manière récursive à la liste des modifications nommée "work". Cela présente un inconvénient: à mesure que de nouveaux fichiers sont ajoutés à la copie de travail, vous devez les ajouter spécifiquement, sinon ils ne seront pas inclus. Deuxièmement, si vous devez l'exécuter à nouveau, vous devrez alors rajouter à 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 figurer que dans une liste de modifications, l'exécution de cet ajout après votre précédent "work" add supprimera le fichier que vous souhaitez ignorer de la liste de modifications "work" et le place dans la liste de modifications "ignore-on-commit".

Lorsque vous êtes prêt à valider vos fichiers modifiés que vous souhaitez valider, vous devez simplement ajouter "--cl work" à votre commit:

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 autre solution consisterait simplement à ajouter chaque fichier que vous souhaitez valider à une liste de modifications 'de travail', sans même maintenir de liste de personnes ignorées, mais cela représente également beaucoup de travail. En réalité, la seule solution idéale et idéale est si/lorsque cela est implémenté dans SVN lui-même. Il existe depuis longtemps un problème à ce sujet dans le suivi des problèmes de Subversion, SVN-2858 , au cas où cela changerait à l'avenir.

114
Joshua McKinnon

Je me suis toujours retrouvé dans cette situation aussi: et les listes de modifications ne fonctionnent pas pour moi - je veux faire une courte liste de fichiers que je ne - pas veux engager, plutôt que de maintenir une liste massive de fichiers que je veux veux m'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!!) 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;

Évidemment, cela est adapté à ma situation - mais modifiez simplement DIR et IGNORE_FILES pour les adapter à votre configuration de développeur. Rappelez-vous de changer le script en exécutable avec:

Sudo chmod +x /usr/bin/svnn

..en utilisant simplement "svnn" au lieu de "svn" pour exécuter Subversion sans craindre de vérifier les modifications locales apportées aux fichiers de la liste IGNORE_FILES. J'espère que ça aide! 

26
user88044

Je ne crois pas qu'il y ait 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 nant pour créer des copies locales.

Par exemple, dans le référentiel est un fichier appelé web.config.default qui a des valeurs par défaut. Créez ensuite une tâche nant qui renommera tous les fichiers web.config.default en web.config et que vous pourrez ensuite personnaliser en 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 devez également ignorer le fichier web.config créé afin de ne pas le valider dans le référentiel.

17
Steven Lyons

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

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

8
gbjbaanb

Je suis arrivé à ce fil à la recherche d'un moyen de faire un commit "atomique" de quelques fichiers et au lieu d'ignorer certains fichiers lors de la livraison, je suis allé dans l'autre sens et j'ai uniquement envoyé les fichiers que je voulais:

svn ci filename1 filename2

Peut-être que ça va aider quelqu'un.

4
Radek

Les gars je viens de trouver une solution. Etant donné que TortoiseSVN fonctionne comme nous le souhaitons, j’ai essayé de l’installer sous Linux - c’est-à-dire tourner 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 commettre: "~/.wine/drive_c/Program\Files/TortoiseSVN/bin/TortoiseProc.exe/command: commit/path: '
  3. Les fichiers exclus seront décochés pour commit par défaut, alors 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 parce que l'entrée de menu permettant de le faire n'a pas été trouvée, je ne sais pas pourquoi. De toute façon, cela fonctionne très bien!)

3
James Fu

Les fichiers en conflit ne sont pas autorisés à être validés. Vous pouvez en tirer parti pour garder vos modifications privées en dehors du référentiel. Cela fonctionne mieux avec un petit nombre de fichiers.

Pour obtenir un conflit pour a-file, votre copie de travail n'a pas le a-file à jour du référentiel, et le a-file contient des modifications qui se trouvent au même emplacement que celles du référentiel (modifications que vous n'avez pas mise à jour pas encore). Si vous ne voulez pas attendre les conditions ci-dessus, vous pouvez créer un conflit pour a-file comme ceci:
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. Valider a-file à partir de WC1. Dans WC2, ajoutez une ligne de texte différente en haut de a-file, par exemple "Je veux un conflit" . Mise à jour à partir de WC2, et maintenant un fichier doit être en conflit. 

2
phi

Mise à jour du script de user88044.

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

Le script extrait les fichiers à ne pas commettre à partir de la commande: svn status --changelist 'do-not-commit'

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

IGNORE_FILES = "$ (svn status --changelist 'ne pas valider' | tail -n +3 | grep -oE '[^] + $')"

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

svn "$ @";

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

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

svnn status, svnn commit, etc ...

1
Nicolas F.

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

Par exemple, avec une ligne, vous pouvez valider tous les fichiers d’extension .h et .cpp auxquels 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" " "`

Modifier/ajouter des extensions à la partie [h|cpp]. Ajoutez un message de journal entre les guillemets de -m "" si nécessaire.

1
Alan Turing

Vous pouvez configurer la liste de modifications "ignore-on-commit" directement avec TortoiseSVN . Il n'est pas nécessaire de configurer une autre liste de modifications, y compris tous les autres fichiers.

1) Cliquez sur "SVN Commit ..." (nous ne commettrons pas, c'est juste un moyen de trouver un menu graphique pour la liste de modifications) 2) Dans la liste Faites un clic droit sur le fichier que vous souhaitez exclure . ) Menu: déplacer dans la liste des modifications> ignore-on-commit

La prochaine fois que vous ferez une validation SVN ... Les fichiers apparaîtront non cochés à la fin de la liste, dans la catégorie ignore-on-commit.

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

1
luney

J'étais fatigué d'attendre que cela soit intégré à SVN. J'utilisais tortoiseSVN avec ignore-on-commit, mais cela ouvre une boîte de dialogue que vous ne pouvez pas supprimer de la ligne de commande. Lorsque je lance mon script de compilation et que je vais faire une tasse de thé, je le déteste Je reviens pour découvrir qu'il attend l'intervention de l'utilisateur 10% du temps. 

Voici donc un script Windows PowerShell qui ne valide que les fichiers qui ne figurent 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
Ben Curthoys

C'est tard dans le jeu, mais j'ai trouvé la commande en ligne de commande la plus impressionnante pour ce problème. Fait en utilisant 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

Je reçois une liste de tous les fichiers. Ils commenceront tous par ces caractères d'état (?,!, A, etc.). Chacun est sur ses propres lignes

grep -v excluding

J'utilise grep pour filtrer la liste. Il peut être utilisé normalement (à inclure) ou avec le drapeau -v (à exclure). Dans ce cas, il est utilisé pour exclure, l'expression "excluant" étant 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 cite chaque ligne à l’aide de sed. Certains de mes noms de fichiers comportent 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 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és comme dernier argument.

Le résultat est que tout fonctionne finalement comme je le souhaite. Je déteste toujours m'excuser de m'avoir forcé à sauter dans ces maudits cerceaux, mais je peux vivre avec cela. Je suppose.

1
user2223059

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

Sur Windows dans PowerShell

ajoute tout à default list.ps1

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

add to ignore list.ps1

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

Maintenant, vous pouvez alias svn ci --changelist default afin de ne pas avoir à le spécifier à chaque fois. L'avantage supplémentaire est que vous pouvez stocker la liste ignore-on-commit (si vous le souhaitez) dans le référentiel. 

Je le fais 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 validation, mais les modifications manuelles sont rares.

1
majkinetor

Comme je faisais exactement 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, s'il vous plaît faites le moi savoir!

J'avais affaire à une installation Prestashop que j'avais reçue de SVN, car d'autres personnes avaient déjà commencé à travailler dessus. Étant donné que les paramètres de 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 configurer dans svn: ignore n’empêcherait pas la modification de mes modifications locales. 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 lancer svn add --force. à la racine du référentiel sans ajouter ma configuration, même si elle ne correspond pas à la version du référentiel (je suppose que je devrais répéter tout cela si je le modifiais une fois de plus, sans test). Je peux également mettre à jour svn sans que mes fichiers soient écrasés ou que des erreurs se produisent.

0
neemzy

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

J'ai essayé d'utiliser la solution basée sur changelist, mais elle me pose quelques problèmes. Tout d'abord, mon référentiel contient des milliers de fichiers. La liste des modifications à valider est donc énorme. Mon résultat svn status est devenu beaucoup trop long et doit être analysé pour être utile. Le plus important est que je voulais valider les modifications issues d'une fusion, ce qui signifie qu'elles incluent les modifications de propriétés. 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û effectuer 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 faire cela pour plusieurs répertoires (ici, j'enregistre les propriétés de DIR et du répertoire courant .), essentiellement celles avec M dans la deuxième colonne lors de l'exécution de la commande svn status.

Solution

J'ai utilisé des correctifs 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, j’utilise un script pour conserver 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 ci et revert -R ..

0
P. Le Sager