Учитывая, что Git не распознает символические ссылки, которые указывают за пределы репозитория, есть ли проблемы с использованием жестких ссылок?
Может ли Git сломать их? Не могли бы вы указать мне подробную информацию?
Учитывая, что Git не распознает символические ссылки, которые указывают за пределы репозитория, есть ли проблемы с использованием жестких ссылок?
Может ли Git сломать их? Не могли бы вы указать мне подробную информацию?
Объект «дерево», представляющий каталоги в Git, хранит имя файла и (подмножество) разрешений. Он не хранит номер инода (или другой идентификатор файла). Поэтому жесткие ссылки не могут быть представлены в git, по крайней мере без сторонних инструментов, таких как metastore или git-cache-meta ( и я не уверен, что это возможно даже с этими инструментами).
Git старается не трогать файлы, которые ему не нужно обновлять, но вы должны учитывать, что git не пытается сохранить жесткие ссылки, поэтому git может их сломать.
О символических ссылках, указывающих за пределы репозитория: у git нет проблем с ними, и он должен сохранять содержимое символических ссылок... но полезность таких ссылок для меня сомнительна, поскольку зависит, будут ли эти символические ссылки сломаны или нет. в макете файловой системы вне репозитория git и не под контролем git.
Выяснил, что с помощью хуков можно перехватывать событие git pull
(когда есть что дергать...) записывая обработчик события скрипта в файл .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
необходимо, потому что вы воссоздаете конечный файл.
Современный клиент git, похоже, естественным образом поддерживает символические и жесткие ссылки внутри репозитория, даже при отправке в удаленное место и последующем клонировании из него. У меня никогда не было необходимости снова связываться за пределами репозитория git...
$ mkdir tmp
$ cd tmp
$ git --version
git version 2.24.3 (Apple Git-128)
$ git init .
Initialized empty Git repository in /Users/teixeira/tmp/.git/
$ mkdir x
$ cd x
$ echo 123 > original
$ cat original
123
$ cd ..
$ ln -s x/original symlink
$ cat symlink
123
$ ln x/original hardlink
$ cat hardlink
123
$ git add .
$ git commit -m 'Symlink and hardlink commit'
[master (root-commit) 8df3134] Symlink and hardlink commit
3 files changed, 3 insertions(+)
create mode 100644 hardlink
create mode 120000 symlink
create mode 100644 x/original
$ cd
$ git clone tmp/ teste_tmp
Cloning into 'teste_tmp'...
done.
$ cd teste_tmp/
$ ls
hardlink symlink x
$ cat symlink
123
$ cat hardlink
123
$ cd ~/tmp
$ git remote add origin https://github.com/myUser/myRepo.git
$ git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (5/5), 361 bytes | 361.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To https://github.com/myUser/myRepo.git
+ 964dfce...8df3134 master -> master
$ cd ../
$ git clone https://github.com/myUser/myRepo.git
Cloning into 'myRepo'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 0), reused 5 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
$ cd myRepo/
$ cat symlink
123
$ cat hardlink
123
https://github.com/mokacoding/symlinks также указывает на важную вещь: символические ссылки должны быть определены относительно .
Из этой проблемы msysgit
Точки соединения не являются символическими ссылками; поэтому символические ссылки просто не поддерживаются в msysGit.
Кроме того, Git никогда не отслеживал жесткие ссылки.
Проблема была ориентирована на Windows (поскольку речь идет о msysgit) и спорах о потенциальной поддержке символической ссылки.
Но комментарий о жесткой ссылке касается Git в целом.
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)
me@server:www/products$ ls -l index.php
-rwxr-xr-x 3 me me 1958 Aug 22 22:10 index.php*
Если я хотел внести изменения в index.php, я меняю его в одном месте, и жесткие ссылки (страницы сведений о продукте) указывают на изменения, за исключением того, что git не сохраняет эту связь во время клонирования и загрузки на другие компьютеры.
me@server:www$ git pull
на другом компьютере будет создан новый index.php для каждой жесткой ссылки.
hardlink --ignore-time
на /var/lib/jenkins
, чтобы освободить место на диске. В течение дня некоторые файлы снова отключаются после git pull
или mvn compile
, но это нормально, я ожидаю, что это произойдет. Если бы git сохранял жесткие ссылки, моя стратегия утилизации дискового пространства не сработала бы.
- person Amedee Van Gasse; 11.03.2019