web-dev-qa-db-fra.com

Dire à Git d'ignorer les liens symboliques

Cette question est apparue sous des formes similaires ici et ici , mais elles ne semblent pas correspondre à ce que je recherche.

Je réalise un projet dans StaticMatic, un générateur de site statique Ruby. Fondamentalement, c'est juste un répertoire src/avec des modèles Haml, Sass et CoffeeScript. StaticMatic fournit un serveur de développement pour continuer à les compiler dans un site statique, ainsi qu'une commande de construction qui génère le site statique dans build /.

Ma modification de StaticMatic consiste à permettre l’ajout de src/_modules/foo /, qui pourrait contenir src/_modules/foo/bar.haml. Lors de l'exécution du serveur ou de la construction du site, un lien symbolique serait créé à l'adresse src/bar.haml, qui pointe vers le fichier dans foo /.

Jusqu'ici tout va bien. (Les conflits sont gérés, etc.)

Le raisonnement derrière des répertoires distincts dans _modules/est qu’ils pourraient être suivis en tant que sous-modules git et extraits indépendamment par d’autres équipes. Cela permet essentiellement à plusieurs équipes de travailler sur différentes pages (en fait, des applications JS) dans un site statique sans dupliquer la présentation principale, etc.

Le hic est que git veut penser ces liens symboliques comme des fichiers. Par exemple, git status indique:

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be commited)
#
#       src/_modules/bar/foo.haml
#       src/foo.haml

... quand je veux vraiment juste montrer src/_modules/bar/foo.haml et ignorer src/foo.haml

Une approche consisterait à ce que mon code générateur de liens ajoute les liens à .gitignore, mais jouer avec .gitignore me semble programmé comme sujet aux erreurs. (Peut-être que cette préoccupation n'est pas raisonnable?)

Ma solution idéale serait quelque chose comme:

[filetype = link]

... dans .gitignore. Autant que je sache, rien de tel n'est possible ou n'est-ce pas?

44
user225643

Cela semble être une meilleure idée

find . -type l | sed -e s'/^\.\///g' >> .gitignore

Find génère un préfixe "./" pour tous les fichiers. Si vous ne le supprimez pas, Gitignore est incapable d’agir en conséquence. Une fois que vous coupez le ". \" Au début, cela fonctionne comme un charme

21
Biswajit_86

Selon la version de git que vous utilisez, il devrait suivre les liens symboliques. Il existe un paramètre de configuration core.symlinks, qui peut être défini sur false et ne permet donc pas à git de les suivre en tant que répertoires (en supposant que git> = 1.6). Il semble tout à fait raisonnable que votre script de création de liens ajoute également ces liens au fichier .gitignore ou simplement les ajoute vous-même. Vous pouvez aussi faire quelque chose comme find . -type l >> .gitignore

17
edwardsharp

Nous avons eu un problème similaire dans lequel nous devions ignorer un répertoire lié symboliquement ou un répertoire réel, mais pas un sous-répertoire du même nom ou un fichier commençant par les mêmes lettres. Par exemple:

  • Ignorer - (lien symbolique) ./media
  • Ignorer - (répertoire) ./media
  • Ne pas ignorer - ./something/media
  • Ne pas ignorer - ./media.bak
  • Ne pas ignorer - ./media-somethingelse

J'ai fini par utiliser ceci dans le .gitignore:

media
!*/media

Ce qui semble un peu étrange mais qui dit fondamentalement (ligne 1) ignore tout "média" mais (ligne 2) ne pas ignore tout "média" qui ne se trouve pas dans le répertoire racine. Cette méthode nécessite un peu de spécificité (pour ne pas ignorer les éléments des sous-répertoires) mais devrait être assez facile à adapter/à étendre.

10
Chris Rasys

Ma réponse de une autre question est pertinente:

for f in $(git status --porcelain | grep '^??' | sed 's/^?? //'); do
    test -L "$f" && echo $f >> .gitignore;
    test -d "$f" && echo $f\* >> .gitignore;
done
3
ColinM

J'ai utilisé la solution qui me convenait le mieux: l'accord de nomination. 

Avec des fichiers Chaque lien symbolique vers un fichier de ma solution avait un préfixe dans un nom du type "bla.outsidemodule.ts". Dans le fichier .gitignore, je venais de:

**/*.outsidemodule.*

Avec les dossiers Également à la racine de la solution, j'avais le dossier "plate-forme", qui avait des bibliothèques/modules communs pour d'autres parties de la solution. La structure était comme ça:

 - ./platform              <- sources
 - ./client/src/platform   <- symlink to ./platform
 - ./server/src/platform   <- symlink to ./platform
 - ./exchange/src/platform <- symlink to ./platform
 - ./service/src/platform  <- symlink to ./platform

Et dans .gitignore juste:

**/platform <- exclude all "platform" folders
!./platform <- do not exclude folder "platform" if it's on a root 
1
Dmitry Astafyev

Je ne conserve pas les exécutables et les liens symboliques dans mon référentiel ... je souhaite donc les omettre également lorsque je crée un "statut git".

Si, comme moi, vous souhaitez ignorer les liens symboliques, les répertoires et les exécutables (par exemple, certains fichiers de $ NAG_HOME/libexec, vous pouvez ajouter ces fichiers dans .gitignore de la manière suivante:

   file * | egrep 'ELF|symbolic|directory' | awk -F\: '{ print $1 }' >> .gitignore

   echo ".gitignore" >> .gitignore

Ensuite, lorsque vous créez un statut git, la liste de ces fichiers ne sera pas renvoyée si vous ne les avez pas ajoutés à votre référentiel.

0
Larry Helms

Ma solution peut sembler idiote, mais je préfère le faire que de mettre à jour le fichier .gitignore chaque fois qu'un nouveau fichier est ajouté.

Je laisse simplement les liens avec un nom par défaut comme "link to xxx" puis j'ajoute la ligne suivante à mon fichier .gitignore:

link to *

Ensuite, assurez-vous de ne nommer aucun autre fichier/dossier dont le nom commence par "link to" et que vous soyez trié.

0
L33tCh