2011-12-28 3 views
41

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

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

Моей модификацией для 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. Насколько я знаю, ничего подобного не возможно или не так ли?

+1

«Заминка в том, что git хочет думать об этих символических ссылках в качестве файлов». Это неправда, он просто хочет отслеживать их как символические ссылки. Я не уверен, что понимаю, почему вы не хотите отслеживать символические ссылки, похоже, что они являются важной частью структуры сайта. –

+1

А, спасибо за разъяснение. Но все же символические ссылки не являются важной частью чего-либо, они предназначены только для временного клея, так что сервер разработки и процесс сборки считают их принадлежащими к директории main/src. Символы воссоздаются каждый раз, когда сервер запущен или создается сборка. – user225643

+0

(Кроме того, причина, по которой я их не хочу, - это то, что вы хотите работать на одной части сайта, не заботясь о том, что модуль был извлечен или обновлен.) – user225643

ответ

17

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

+2

'git config core.symlinks false' (для тех, кто просматривает чтение). Но имейте в виду, что это проверяет символические ссылки как текстовые файлы, назначение которых может быть недействительным для системы другого пользователя. – JellicleCat

19

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

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

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

+8

Нет необходимости в sed. Замените '.'' '' '' '' find * -type l >> .gitignore' – nickptrvc

+0

найти выходные ссылки в формате ./, которые смешивают gitignore. Команда удаляет ./ с начала результатов –

+1

@ Biswajit_86 'find .' prepends'./'But' find * 'does not. Я думаю, это то, о чем говорит @nickptrvc. Я не знаю, останется ли все остальное, но кажется на первый взгляд. – Mark

2

Мой ответ от another question имеет отношение:

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

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

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

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

    echo ".gitignore" >> .gitignore 

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

7

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

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

Я закончил с использованием этого в .gitignore:

media 
!*/media 

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

+4

Вы можете просто сделать '/ media'. Абсолютные пути относятся к каталогу, содержащему файл gitignore. – Zenexer

+0

@ Zenexer, это отлично сработало для меня спасибо !!! – Jake

-1

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

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

link to * 

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

+1

, но тогда нам придется переделать весь проект, чтобы ссылаться на любые символические ссылки как на «link \ to \ original_name», нет, спасибо! – pythonian29033

+0

Ну, это, конечно, «вне коробки», думающий о подходе. Я оценил вдохновение. – kkahl

Смежные вопросы