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