Говоря git игнорировать символические ссылки - PullRequest
44 голосов
/ 28 декабря 2011

Этот вопрос появился в похожих формах здесь и здесь , но, похоже, они не совпадают с тем, что я ищу.

Я делаю проект в StaticMatic, генераторе статических сайтов на Ruby. По сути, это просто каталог src / с шаблонами Haml, Sass и CoffeeScript. StaticMatic предоставляет сервер разработки для продолжения их компиляции в статический сайт, а также команду сборки, которая генерирует статический сайт в build /.

Моя модификация StaticMatic - разрешить добавление src / _modules / foo /, который может содержать src / _modules / foo / bar.haml. При запуске сервера или создании сайта будет создана символическая ссылка в src / bar.haml, которая указывает на файл в foo /.

Пока все хорошо. (Конфликты обрабатываются и т. Д.)

Причина существования отдельных каталогов в _modules / заключается в том, что они могут отслеживаться как подмодули git и независимо проверяться другими командами. По сути, это позволяет нескольким группам работать над разными страницами (фактически приложениями JS) на одном статическом сайте без дублирования основного макета и т. Д.

Проблема в том, что git хочет рассматривать эти символические ссылки как файлы. Например, git status показывает:

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

... когда я действительно хочу, чтобы он показывал src/_modules/bar/foo.haml и игнорировал src/foo.haml

Один из подходов состоит в том, чтобы мой код, генерирующий ссылки, добавлял ссылки к .gitignore, но программная обработка .gitignore программно показалась мне склонной к ошибке. (Возможно, это беспокойство не разумно?)

Мое идеальное исправление было бы что-то вроде:

[filetype = link]

... в .gitignore. Насколько я знаю, ничего подобного не возможно, или это так?

Ответы [ 7 ]

21 голосов
/ 07 октября 2014

Это, кажется, лучшая идея

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

Найти выводит префикс "./" для всех файлов.Если вы не урежете это, gitignore не сможет воздействовать на них.Как только вы обрежете ". \" В начале, он работает как шарм

17 голосов
/ 28 декабря 2011

В зависимости от того, какую версию git вы используете, он должен следовать символическим ссылкам. Есть настройка config core.symlinks, которая может быть установлена ​​в false и, таким образом, не позволяет git следовать за ними как каталогами (при условии, что git> = 1.6). Кажется совершенно разумным, чтобы ваш сценарий символических ссылок также добавлял эти ссылки в файл .gitignore или просто добавлял их самостоятельно. Вы также можете сделать что-то вроде find . -type l >> .gitignore

10 голосов
/ 17 сентября 2015

У нас была похожая проблема, когда нам нужно было игнорировать символьный каталог или реальный каталог, но не подкаталог с тем же именем или файл начиная с тех же букв. Например:

  • Игнорировать - (символическая ссылка) ./media
  • Игнорировать - (каталог) ./media
  • Не игнорируйте - ./something/media
  • Не игнорируйте - ./media.bak
  • Не игнорируйте - ./media-somethingelse

Я использовал это в .gitignore:

media
!*/media

Что выглядит немного странно, но в основном говорит (строка 1) игнорировать все «носители», но (строка 2) не игнорирует все «носители», которых нет в корневом каталоге. Этот метод требует небольшой специфики (чтобы не игнорировать вещи в подкаталогах), но его довольно легко адаптировать / расширять.

3 голосов
/ 28 октября 2014

Мой ответ от другой вопрос актуален:

for f in $(git status --porcelain | grep '^??' | sed 's/^?? //'); do
    test -L "$f" && echo $f >> .gitignore;
    test -d "$f" && echo $f\* >> .gitignore;
done
1 голос
/ 26 октября 2018

Я использовал наиболее подходящее для меня решение - соглашение об именах.

С файлами Каждая символическая ссылка на файл в моем решении имеет префикс с именем вроде «bla.outsidemodule.ts». В файле .gitignore у меня было просто:

**/*.outsidemodule.*

С папками Также в корне решения у меня была папка «платформа», в которой были общие библиотеки / модули для других частей решения. Структура была похожа на это:

 - ./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

А в .gitignore просто:

**/platform <- exclude all "platform" folders
!./platform <- do not exclude folder "platform" if it's on a root 
0 голосов
/ 06 января 2016

Мое решение может показаться глупым, но я бы предпочел сделать это, чем обновлять файл .gitignore каждый раз, когда добавляется новый файл.

Я просто оставляю ссылки с именем по умолчанию, например "link to xxx", а затем добавляю следующую строку в мой файл .gitignore:

link to *

Тогда вы просто гарантируете, что не называете никаких других файлов / папок именем, начинающимся с «link to», и вы отсортированы.

0 голосов
/ 30 января 2015

Я не храню исполняемые файлы и символические ссылки в своем репозитории ... поэтому я хочу их также опускать, когда я делаю "git status".

Если, как и я, вы хотитеигнорировать символические ссылки, каталоги и исполняемые файлы (например, некоторые файлы в $ NAG_HOME / libexec вы можете добавить эти файлы в .gitignore следующим образом:

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

   echo ".gitignore" >> .gitignore

Затем, когда вы делаете состояние git,выплюнуть список этих файлов, если вы не добавили их в свой репозиторий.

...