Подтвердить что ты не робот

Сообщение git игнорировать символические ссылки

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

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

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

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

Обоснование отдельных каталогов в модулях/состоит в том, что их можно было отслеживать как подмодули 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. Насколько я знаю, ничего подобного не возможно, или это?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

В итоге я использовал это в .gitignore:

media
!*/media

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

Ответ 4

Мой ответ из еще один вопрос:

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

Ответ 5

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

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

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

   echo ".gitignore" >> .gitignore

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

Ответ 6

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

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

link to *

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