#!/usr/bin/env ruby
require 'optparse'
path = File.expand_path '~/.git-credentials' ①
OptionParser.new do|opts|
opts.banner = 'USAGE: git-credential-read-only [options] '
opts.on( '-f' , '--file PATH' , 'Specify path for backing store' ) do|argpath|
path = File.expand_path argpath
end
end.parse!
exit(0) unlessARGV[0].downcase == 'get' ②
exit(0) unlessFile.exists? path
known = {} ③
whileline = STDIN.gets
break ifline.strip == ''
k,v = line.strip.split '=' , 2
known[k] = v
end
File.readlines(path).each do|fileline| ④
prot,user,pass,host = fileline.scan( /^(.*?):\/\/(.*?):(.*?)@(.*)$/ ).first
ifprot == known[ 'protocol' ] andhost == known[ 'host' ] then
puts "protocol= #{ prot }"
puts "host= #{ host }"
puts "username= #{ user }"
puts "password= #{ pass }"
exit(0)
end
end
1. ①Здесь мы разбираем аргументы командной строки, позволяя указывать пользователям входной файл. По умолчанию это ~/.git-credentials.
2. ②Эта программа отвечает только если операцией является get и файл хранилища существует.
3. ③В цикле считываются данные из стандартного ввода, до тех пор пока не будет прочитана пустая строка. Введенные данные для дальнейшего использования сохраняются в отображении known.
4. ④Этот цикл читает содержимое файла хранилища, выполняя поиск соответствия. Если протокол и сервер из known соответствуют текущей строке, программа выводит результат и завершает работу.
Мы сохраним нашего помощника как git-credential-read-only, расположим его в одной из директорий из PATH и сделаем его исполняемым. Ниже приведено на что будет похож сеанс взаимодействия:
$git credential-read-only --file=/mnt/shared/creds get
protocol=https
host=mygithost
protocol=https
host=mygithost
username=bob
password=s3cre7
Так как его имя начинается с “git-”, мы можем использовать простой синтаксис для настройки:
$git config --global credential.helper read-only --file /mnt/shared/creds
Как вы видите, расширять эту систему довольно просто и это позволяет решить некоторые общие проблемы, которые могут возникнуть у вас и вашей команды.
Вы познакомились с множеством продвинутых инструментов, которые позволяют вам более точно управлять вашими коммитами и областью подготовленных изменений. Когда вы столкнетесь с какими-то проблемами, вы должны легко выяснить, каким коммитом они были добавлены, когда и кем. На случай, если в вашем проекте вы захотите использовать подпроекты, вы уже изучили как этого можно добиться. Таким образом, к этому моменту вы должны уметь выполнять в командной строке большинство вещей, необходимых при повседневной работе с Git, и при этом чувствовать себя уверенно.
До этого момента мы описывали основы того, как Git работает, и как его использовать. Также мы познакомились с несколькими предоставляемыми Git’ом инструментами, которые делают его использование простым и эффективным. В этой главе мы пройдёмся по некоторым действиям, которые вы можете предпринять, чтобы заставить Git работать в нужной именно вам манере. Мы рассмотрим несколько важных настроек и систему перехватчиков (hook). С их помощью легко сделать так, чтобы Git работал именно так как вам, вашей компании или вашей группе нужно.
В разделе Введение кратко упоминалось, что вы можете настроить Git, используя команду git config. Первое, что вы делали, это установили своё имя и e-mail адрес:
$git config --global user.name "John Doe"
$git config --global user.email johndoe@example.com
Сейчас вы познакомитесь с несколькими наиболее интересными опциями, которые можно установить для настройки поведения Git.
Кратко: Git использует набор конфигурационных файлов для изменения стандартного поведения, если это необходимо. Вначале, Git ищет настройки в файле /etc/gitconfig, который содержит настройки для всех пользователей в системе и всех репозиториев. Если передать опцию --system команде git config, то операции чтения и записи будут производиться именно с этим файлом.
Следующее место, куда смотрит Git - это файл ~/.gitconfig (или ~/.config/git/config), который хранит настройки конкретного пользователя. Вы можете указать Git читать и писать в него, используя опцию --global.
Наконец, Git ищет параметры конфигурации в файле настроек в директории Git (.git/config) используемого в данный момент репозитория. Эти значения относятся только к текущему репозиторию.
Каждый из этих “уровней” (системный, глобальный, локальный) переопределяет значения предыдущего уровня, например, значения из .git/config важнее значений из /etc/gitconfig.
Читать дальше