Как работать с веткой по умолчанию в gitconfig и сценариях оболочки

У меня был файл, который появился через ls, но я не смог rmего.

Мне удалось mvпереместить файл в новый каталог.

В моем конкретном случае, чтобы файл отображался в ls, мне пришлось использовать подстановочный знак (, например. ls./some*.jpeg), и мне пришлось использовать тот же подстановочный знак в mv(, например.mv./some*.jpeg./newdir). Кроме того, в моем случае я хотел сохранить файл (, но он был поврежден ). Однако, как только я переместил файл в новый каталог, я смог переместить его обратно в исходный каталог, и файл больше не был поврежден.

0
09.11.2020, 07:12
2 ответа

Git не имеет концепции ветки по умолчанию. Репозиторий может содержать множество независимых линий разработки (, например, ветвь обслуживания и ветвь разработки ), ни одна из которых не является более специальной, чем любая другая. Важность веток и способ их объединения зависит от владельца репозитория.

То, что вы считаете веткой по умолчанию на GitHub и в других местах, — это ветка, на которую указывает HEADв голом репозитории. Вы можете увидеть, какое имя было у удаленного устройства, когда вы в последний раз обновляли его, запустив:

$ git rev-parse --abbrev-ref origin/HEAD
origin/master

Если вы хотите узнать самое последнее значение с удаленного устройства и готовы сделать для этого сетевой запрос, вы можете сделать это:

$ git ls-remote --symref origin | head -n1
ref: refs/heads/master  HEAD

Обратите внимание, что эта ссылка не обновляется автоматически; вы должны запустить git remote set-head -a origin, чтобы обновить его.

Однако это не говорит вам имя локальной ветки, которую вы используете в качестве ветки по умолчанию. Например, приведенная выше команда взята из моей копии Git, где ветка по умолчанию — master. Однако на моем локальном компьютере ветвь, в которую извлекается ветвь удаленного репозитория по умолчанию, называется dev(, это мое предпочтительное имя ветки по умолчанию ). Если это то, что вы хотите знать, то это, вероятно, та команда, которую вы хотите (, предполагая, что originявляется вашим удаленным):

$ git config -l | ruby -e '
remote = ARGV[0]
head = `git rev-parse --abbrev-ref #{remote}/HEAD`.chomp
a = {}
while line = $stdin.gets
  if line =~ /^branch\.(.*)\.remote=(.*)$/
    a[$1] ||= [nil, nil]
    a[$1][0] = $2
  elsif line =~ %r[^branch\.(.*)\.merge=refs/heads/(.*)$]
    a[$1] ||= [nil, nil]
    a[$1][1] = $2
  end
end
puts a.map { |k, (a, b)| ["#{a}/#{b}", k]}.to_h[head]' origin

Так как это Ruby, если вы хотите сделать его одной -строкой, вы можете поставить точку с запятой вместо новой строки. Вы также можете использовать Perl, если вам это больше нравится.

2
18.03.2021, 22:51

Нет специальной команды для получения ветки по умолчанию. Однако с небольшим количеством обходных путей вы можете получить это. Если вы используете свои собственные репозитории, вы всегда можете выбрать одно и то же имя. Если вы используете других, у них будет какой-то пульт, и тогда может помочь этот трюк (от Дэвида Уолша):

LC_ALL=C git remote show origin | sed -n '/HEAD branch:/{s/.*: //;p}'
1
18.03.2021, 22:51

Теги

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