Dire à git d'ignorer les symlinks
Cette question est apparue dans les mêmes formes ici et ici , mais ils ne semblent pas correspondre avec ce que je suis à la recherche pour.
je fais un projet dans StaticMatic, un générateur de site statique de 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 les compiler dans un site statique, ainsi qu'une commande build qui génère site Statique En construction/.
ma modification à StaticMatic est de 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éé à src/bar.haml qui pointe vers le fichier foo/.
pour l'instant tout va bien. (Les conflits sont traités, etc.)
le raisonnement derrière les répertoires séparés dans _modules / est qu'ils pourraient être suivis comme git sous-modules et vérifié indépendamment par d'autres équipes. Essentiellement, cela permet à plusieurs équipes de travailler sur différentes pages (en fait js apps) dans un site statique sans dupliquer la mise en page principale et ainsi de suite.
le hic, c'est que git veut considérer ces liens symboliques comme des fichiers. Par exemple, git status
montre:
# 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 qu'il montre src/_modules/bar/foo.haml
et d'ignorer src/foo.haml
One l'approche serait de faire ajouter les liens à mon code générateur de liens .gitignore, mais déconner .gitignore me semble programmatiquement sujet à erreur. (Peut-être que cette préoccupation n'est pas raisonnable?)
ma solution idéale serait quelque chose comme:
[filetype = link]
...dans .gitignore. Pour autant que je sache, rien de tel n'est possible, n'est-ce pas?
6 réponses
Cela semble être une meilleure idée
find . -type l | sed -e s'/^\.\///g' >> .gitignore
Trouver des sorties "./" préfixe pour tous les fichiers. Gitignore est incapable d'agir sur eux . Une fois que vous coupez le ".\" au début , il fonctionne comme un charme
en fonction de la version de git que vous utilisez devrait suivre des liens symboliques. Il y a un paramètre de configuration de base.symlinks, qui peut être défini à false et donc ne pas laisser git les suivre en tant que répertoires (en supposant git >= 1,6). Il semble tout à fait raisonnable d'avoir votre script symlinking aussi ajouter ces liens vers le .gitignore fichier ou tout simplement les ajouter vous-même. Vous pourriez aussi faire quelque chose comme find . -type l >> .gitignore
nous avons eu un problème similaire où nous avons dû ignorer un annuaire symlinked 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 ./quelque chose/médias
- Do ne pas ignorer ./Média.bak
- Ne pas ignorer ./ media-somethingelse
j'ai fini par utiliser ceci dans le .gitignore:
media
!*/media
qui semble un peu étrange mais qui dit essentiellement (ligne 1) ignorer tout" média "mais (ligne 2) ne pas ignorer tout" média " qui n'est pas dans le répertoire racine. Cette méthode exige un peu de spécificité (en ce qui concerne le fait de ne pas sous-répertoires) mais devrait être assez facile à adapter/étendre.
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
Je ne garde pas les exécutables, et les liens symboliques dans mon dépôt... donc je veux les omettre aussi bien quand je fais un "statut git".
si, comme moi, vous voulez ignorer les liens symboliques, les répertoires et les exécutables (ala certains des fichiers de $NAG_HOME/libexec dans lesquels vous pouvez ajouter ces fichiers).gitignore comme suit:
file * | egrep 'ELF|symbolic|directory' | awk -F\: '{ print }' >> .gitignore
echo ".gitignore" >> .gitignore
ensuite, lorsque vous faites un statut git, il ne recrache pas la liste de ces fichiers si vous ne les avez pas ajoutés à votre dépôt.
ma solution peut sembler stupide, mais je préfère faire ça plutôt que de mettre à jour le .gitignore fichier à chaque fois qu'un nouveau fichier est ajouté.
je laisse simplement les liens avec un nom par défaut comme" link to xxx " et puis j'ajoute la ligne suivante à my .dossier gitignore:
link to *
ensuite, vous vous assurez juste de ne pas nommer d'autres fichiers/dossiers avec un nom commençant par "lien vers" et vous êtes triés.