161 votes

SVN : Existe-t-il un moyen de marquer un fichier comme "do not commit" ?

Avec TortoiseSVN, je peux déplacer un fichier dans la liste des changements ignorés lors de la livraison, de sorte que lorsque je livre un arbre entier, les changements à ce fichier ne sont pas livrés.

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

EDIT : Merci pour les suggestions d'utilisation svn:ignore mais cela ne correspond pas tout à fait à ce que je recherchais.

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 la source, mais je veux apporter des modifications temporaires à ce fichier que je ne veux pas voir validées plus tard lorsque je validerai l'ensemble de l'arbre source. Je suis en train de faire beaucoup d'autres changements et je pourrais coller une note sur mon écran me disant de rétablir ce fichier avant de livrer l'arbre, mais ce serait bien si svn pouvait automatiquement ignorer ce fichier.

1 votes

Il existe un moyen d'utiliser la branche personnelle et le statut de commutation. [Voir mon autre message sur ce sujet] [1] [1] : stackoverflow.com/questions/862950/

123voto

Joshua McKinnon Points 12379

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

Comme l'indique l'OP, TortoiseSVN a une liste de changements intégrée, "ignore-on-commit", qui est automatiquement exclue des commits. Le client en ligne de commande ne dispose pas de cette fonctionnalité. Vous devez donc utiliser plusieurs listes de modifications pour obtenir le même résultat (avec des restrictions). :

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

Comme 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 livrer. J'utiliserai "work" pour les fichiers que je veux livrer, mais vous pouvez choisir le nom que vous voulez.

Tout d'abord, ajoutez tous les fichiers à une liste de modifications nommée "travail". Ceci 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 récursivement à la liste de modifications nommée "travail". Il y a un inconvénient à cela - lorsque 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 relancer cette opération, vous devrez à nouveau ajouter tous vos fichiers "ignore-on-commit". Ce n'est pas idéal - vous pourriez commencer à maintenir votre propre liste d'ignorés dans un fichier comme d'autres l'ont fait.

Ensuite, pour les fichiers que vous voulez exclure :

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

Comme les fichiers ne peuvent figurer que dans une seule liste de modifications, l'exécution de cet ajout après votre précédent ajout "travail" supprimera le fichier que vous voulez ignorer de la liste de modifications "travail" et le placera dans la liste de modifications "ignorer sur commande".

Lorsque vous êtes prêt à livrer les fichiers modifiés que vous souhaitez livrer, il vous suffit d'ajouter "--cl work" à votre livraison :

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 de simplement ajouter chaque fichier que vous souhaitez livrer à une liste de modifications "travail", et de ne même pas maintenir une liste d'ignorés, mais c'est aussi beaucoup de travail. Vraiment, la seule solution simple et idéale est si/quand cela sera implémenté dans le SVN lui-même. Il y a un problème de longue date à ce sujet dans le gestionnaire de problèmes de Subversion, SVN-2858 au cas où cela changerait à l'avenir.

1 votes

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 du commit. Une idée de ce que j'ai fait de mal ?

7 votes

L'ajout de fichiers à la liste de modifications "ignore-on-commit" n'empêche pas en soi les fichiers d'être livrés. TortoiseSVN (un client Windows GUI) a intégré le respect de "ignore-on-commit", mais svn en ligne de commande ne le fait pas. La seule suggestion que j'ai faite dans ma réponse initiale était d'ajouter les fichiers que vous voulez livrer à une liste de changements, et de dire au logiciel de livrer cette liste.

7 votes

Ignore-on-commit est définitivement une liste réservée à Tortoise. Tout ce qu'elle fait est d'empêcher les éléments d'être vérifiés dans l'interface graphique par défaut, donc c'est une fonctionnalité spécifique à l'interface graphique de Tortoise. Vous n'avez pas besoin d'utiliser la ligne de commande pour ajouter à la liste si vous utilisez l'interface graphique. Il suffit d'utiliser le menu contextuel sur les éléments de la liste des livraisons et en bas, vous pouvez les déplacer vers une liste de modifications et ignorer sur les livraisons est déjà défini. tortoisesvn.net/docs/release/TortoiseSVN_fr/

26voto

user88044 Points 121

Je me suis toujours trouvé dans cette situation : les listes de modifications ne fonctionnent pas pour moi. Je veux faire une courte liste de fichiers que je no que je veux commettre, plutôt que de maintenir une liste m-a-s-s-i-v-e de fichiers que je faire veulent 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' !) 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, ceci est adapté à ma situation - mais il suffit de modifier 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

alors il suffit d'utiliser "svnn" au lieu de "svn" pour exécuter subversion sans craindre de vérifier les modifications locales des fichiers de la liste IGNORE_FILES. J'espère que cela vous aidera !

0 votes

Enfin, cette réponse est en fait la bonne. Vous devez écrire un outil. C'est en fait imparfait, parce que je veux avoir une option dynamique, comme svnn ignore configs/* - avec des caractères de remplacement, et des cloches et des sifflets. Je pense que je vais écrire quelque chose comme ça moi-même, et ensuite revenir ici !

0 votes

C'est génial ! Encore mieux, créez un alias dans .bashrc pour svn -> svnn. Encore mieux, 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 tous les fichiers qui correspondent au modèle.

0 votes

Au lieu de devoir réapprendre à taper svnn envisagez de l'appeler svn et en plaçant ce script dans quelque chose qui peut être au début de votre PATH, tel que ${HOME}/bin . A partir du script lui-même, vous appelleriez alors /usr/bin/svn .

19voto

Steven Lyons Points 5481

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

Bien qu'elle ne soit pas parfaite, la solution que je vois et utilise le plus souvent consiste à avoir un fichier .default et une tâche nant pour créer des copies locales.

Par exemple, dans le repo se trouve un fichier appelé web.config.default qui a des valeurs par défaut. Ensuite, créez une tâche nant qui renommera toutes les web.config.default pour web.config qui peut ensuite être personnalisé en fonction des valeurs locales. Cette tâche doit être appelée lorsqu'une nouvelle copie de travail est récupérée ou qu'un build est exécuté.

Vous devrez également ignorer le web.config qui est créé afin qu'il ne soit pas livré au référentiel.

8voto

gbjbaanb Points 31045

Vérifiez listes de modifications qui peut vous fournir une option pour filtrer les fichiers que vous avez modifiés mais que vous ne voulez pas livrer. SVN ne sautera pas automatiquement un fichier à moins que vous ne le lui demandiez - et la façon de lui dire que ce fichier est différent des autres est de le mettre dans une liste de changements.

Cela vous demande plus de travail, 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 votes

Mais c'est exactement ce que nous voulons. Par exemple, un fichier source dans lequel vous devez définir un defaultUserId = votreId, au lieu du défaut du système.

5voto

Radek Points 1908

Je suis venu sur ce fil de discussion en cherchant un moyen de faire un commit "atomique" de juste quelques fichiers et au lieu d'ignorer certains fichiers sur le commit, j'ai fait l'inverse et n'ai commité que les fichiers que je voulais :

svn ci filename1 filename2

Peut-être que ça aidera quelqu'un.

0 votes

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X