Git и жесткие ссылки

Учитывая, что Git не распознает символические ссылки, которые указывают вне репозитория, есть ли проблема с использованием жестких ссылок?

Может ли Git сломать их? Не могли бы вы указать мне подробную информацию?

Ответ 1

Объект 'tree', представляющий каталоги в Git, сохраняет имя файла и (подмножество) разрешений. Он не хранит номер inode (или другой идентификатор файла). Поэтому жесткие ссылки не могут быть представлены в Git, по крайней мере, без сторонних инструментов, таких как metastore или git -cache-meta (и я не уверен, что это возможно даже с этими инструментами).

Git пытается не прикасаться к файлам, которые не нужно обновлять, но вы должны учитывать, что git не пытается сохранить hardlinks, поэтому их можно сломать git.


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

Ответ 2

Хорошо, теперь это поздний ответ = D

Я узнал, что с помощью перехватчиков вы можете захватить событие git pull (когда есть что тянуть...), записывая обработчик события script в файл .git/hooks/post-merge.

Во-первых, вы должны chmod +x его.

Затем добавьте в него команды ln, чтобы воссоздать жесткие ссылки при каждом нажатии. Неплохо, да!

Это работает, мне просто нужно, чтобы для моего проекта и ls -i показано, что файлы были автоматически связаны после pull.


Мой пример .git/hooks/post-merge:

#!/bin/sh
ln -f $GIT_DIR/../apresentacao/apresentacao.pdf $GIT_DIR/../capa/apresentacao.pdf
ln -f $GIT_DIR/../avaliacoesMono/avaliacao_monografias_2011_Nilo.pdf $GIT_DIR/../capa/avaliacoes.pdf
ln -f $GIT_DIR/../posters/poster_Nilo_sci.pdf $GIT_DIR/../capa/poster.pdf
ln -f $GIT_DIR/../monografia/monografia_Nilo.pdf $GIT_DIR/../capa/monografia_Nilo.pdf

ВАЖНО: как вы можете видеть, путь к любому файлу в вашем репозитории должен начинаться с $GIT_DIR, а затем добавить частичный относительный путь к файлу.

Также важно: -f необходимо, потому что вы воссоздаете файл назначения.

Ответ 3

Из этого msysgit issue

Точки соединения не являются символическими ссылками; поэтому символические ссылки просто не поддерживается в msysGit.

Кроме того, жесткие ссылки никогда не отслеживались с помощью Git.

Проблема была ориентирована на Windows (так как речь идет о msysgit) и обсуждается потенциальная поддержка symlink.
Но комментарий о жесткой ссылке касается Git в целом.

Ответ 4

Google 'git сохранить жесткие ссылки', и он показывает, что git не знает, как сохранить жесткую структуру ссылок AFAIK, возможно, по дизайну.

Веб-проекты моих рудников используют жесткие ссылки следующим образом:

www/products/index.php
www/products/dell_latitude_id577/index.php #(hard linked to above)
www/products/dell_inspiron_id323/index.php #(hard linked again to above)

[email protected]:www/products$ ls -l index.php
-rwxr-xr-x 3 me me 1958 Aug 22 22:10 index.php*

Если я хотел внести изменения в index.php, я меняю его в одном месте, а жесткие ссылки (страницы подробностей продукта) указывают на изменения - кроме git не сохраняются эти отношения во время клонирования и вытягивания на другие компьютеры.

[email protected]:www$ git pull

на другой машине будет создан новый index.php для каждой жесткой ссылки.