Общие папки Virtualbox с символическими ссылками

Итак, проверка кода.

# Usage: pushes current checkout branch to its remote counterpart.

Пропустить первое слово. Это комментарий, описывающий, что делает скрипт, а не как его использовать.

current_branch=$(git symbolic-ref HEAD 2>/dev/null) ||
current_branch="(unnamed branch)"

Вы запускаете git symbolic-ref HEAD, отбрасываете его stderrи назначаете stdoutпеременной. В случае неудачи вы берете имя ветки (unnamed branch).

git push origin ${current_branch}

В итоге вы отправляете свою локальную ветку в источник.


Вот некоторые пояснения:

Часть 2>/dev/null

Каждая программа, работающая на терминале Linux/Unix, имеет канал ввода, называемый stdin, который обычно собирает ваш ввод с клавиатуры. Он также имеет два выходных канала, называемыхstdout(стандартным выводом для вывода информации о нормальной работе )иstderr(стандартным выводом ошибок для вывода предупреждений и ошибок времени выполнения ). Эти каналы возникли в аппаратном обеспечении, но теперь являются чисто программным стандартом, поддерживаемым каждым терминалом и каждой оболочкой. Bash обрабатывает каналы stdout и stderr с помощью указателей, представленных числами 1и 2. То, что делает часть 2>, говорит программе перенаправить ее stderr на другую цель. /dev/null— это виртуальное устройство, которое фактически действует как черная дыра. Все, что отправлено туда, просто потеряно. Таким образом, 2>/dev/nullбуквально означает «не печатать нестандартный вывод -».

|| часть

Двойной канал в bash означает :Если программа в левой части завершилась неудачно, т. е. была возвращена с кодом выхода, отличным от 0, запустите правую часть двойного канала. Ваша «правая» сторона продолжается на следующей строке, где вы назначаете той же переменной резервное значение.


Вернемся к обзору.

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

Ваш код этого не делает. Ну не достоверно.

HEADв git — это специальная ссылка, указывающая на самую новую фиксацию в текущей проверенной ветке, если таковая имеется. В последней части ваш код опасен. HEADне обязательно всегда указывает на ветвь. Он также может находиться в так называемом -состоянии detached HEAD. В этом случае ваша команда завершится ошибкой fatal: ref HEAD is not a symbolic ref. Эта ошибка отбрасывается вашим сценарием, и вместо этого она будет продолжаться с именем ветки (unnamed branch). Последняя строка затем попытается отправить вашу локальную ветку как (unnamed branch), что вам, вероятно, не нужно.

Даже если команда выполнена успешно, вы получите результат вида refs/heads/yourbranchname. Вы можете использовать опцию --short, чтобы получить только последнюю часть :

.
git symbolic-ref --short HEAD

Результат будет:

yourbranchname

Что, если у нас нет филиала? Простой. Вы не хотите толкать ничего! Вы должны выйти из скрипта, если имя ветки не может быть определено. Вы можете сделать это следующими способами. Либо добавьте явный exit $errorcode, либо используйте флаг bash set -e:

.
current_branch=$(git symbolic-ref HEAD) || exit $?

Здесь $?содержит код выхода последней команды, то есть неудачный вызов git. Вам не нужно скрывать stderr. Полезно определить, что пошло не так.

В качестве альтернативы:

set -e
current_branch=$(git symbolic-ref HEAD)

set -eвключает специальный режим bash, при котором происходит выход из скрипта при каждой ошибке. Я настоятельно рекомендую вам использовать его в каждом сценарии.

Следующая часть:

git push origin ${current_branch}

В этом приказе нет ничего плохого, но я думаю, что вы слишком усложняете себе жизнь. Эта подробная команда нужна только один раз, чтобы создать связь между локальной ветвью и удаленной. Вы можете сохранить эту ссылку, используя опцию -u, например:

git push -u origin ${current_branch}

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

Подведем итоги

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

#!/usr/bin/env bash

# Pushes current checkout branch to its remote counterpart.

set -e

current_branch=$(git symbolic-ref --short HEAD)
git push -u origin "${current_branch}"

Запустив его один раз для новой ветки, просто используйте:

git push
0
29.12.2020, 09:43
2 ответа

Это работает как задумано. Если бы вашим гостям был разрешен доступ к файлам/каталогам за пределами исходного общего ресурса -, что именно и произошло бы в предложенном вами сценарии -, тогда безопасность на хосте была бы бессмысленной.

Думаю, лучше всего (2 )вещи:

  1. Создайте общий ресурс -более высокого уровня, чтобы любые новые каталоги автоматически становились частью общей файловой системы (s ).
  2. Используйте относительные ссылки (на хосте ), чтобы структуры каталогов (на гостевых компьютерах )оставались нетронутыми. Таким образом, точка монтирования гостей не будет иметь значения.
1
18.03.2021, 22:40

Вероятно, немного поздно, чтобы помочь вам, но может быть полезно для кого-то еще. Я только что потратил целую вечность, пытаясь понять это.

Хост/гость Linux с 2 общими папками.

1 общая папка содержит созданные хостом символические ссылки на другую общую папку, гость пытается разрешить ссылки, но не может перейти по ним, поскольку путь был неправильным для гостя (, т.е. символическая ссылка указывает на /media/folder/file.aaa(, которая существует на хост )вместо /media/sf_folder/file.aaa(, где папка сопоставляется с гостем ).

Итак, я собирался пойти по маршруту самбы, но есть гораздо более простое решение, если вы создадите в гостевой системе файл:/etc/modprobe.d/vboxsf.confс этой единственной строкой:

options vboxsf follow_symlinks=1

затем перезагрузите гостя, теперь хост будет разрешать символические ссылки, чтобы гость мог перейти по ним!

источник

1
13.06.2021, 08:58

Теги

Похожие вопросы