push-коммиты в git (gitolite) репозиторий портит права доступа к файлам (больше нет доступа к trac)
Уже размещен здесь, так что не стесняйтесь ответить там.
каждый раз, когда я фиксирую / отправляю что-то на git-сервер, права доступа к файлам меняются (все добавленные / отредактированные файлы в хранилище не имеют права на чтение и выполнение для группы). таким образом, trac не может получить доступ к хранилищу.
мне нужно изменить права доступа к папке по-другому?
chmod u = rwx, g = rx, o = -R / home / git / репозитории
или мне нужно как-то настроить gitolite для записи файлов с разными разрешениями???
С уважением, клеменс
2 ответа
Установка umask/default umask не имеет никакого эффекта, потому что у gitolite есть свои собственные настройки.
на ~ /.gitolite.rc
$ REPO_UMASK = 0027;
установите как хотите:)
Git отслеживает только имена файлов и данные этих файлов. Он не отслеживает метаданные файловой системы (владение, права доступа, ...).
Umask может быть эффективным решением, если вы хотите, чтобы все файлы имели одинаковые разрешения.
Я отслеживал системные файлы на нескольких серверах с помощью Git уже 3 года. Мне нужен был способ отслеживания изменений в разрешениях, а также данных. Я написал скрипт на Ruby для захвата прав доступа / владения файлом и помещения его в файл. Этот файл теперь можно отслеживать с помощью git. Всякий раз, когда нужно восстановить эти метаданные, я использую другой скрипт Ruby, который читает файл и восстанавливает разрешения.
В течение 3 лет я регулярно использую эти сценарии, и они меня не подводят.
Вот они:
Скрипт: save-fs-permissions
#!/usr/bin/ruby
RM = "/bin/rm"
SORT = "/usr/bin/sort"
TMP = "/tmp/save_fs_permissions_#{Time.now.to_i}_#{rand * 899 + 100}"
require 'find'
IGNORE = [".git"]
def numeric2human(m)
return sprintf("%c%c%c%c%c%c%c%c%c",
(m & 0400 == 0 ? ?- : ?r),
(m & 0200 == 0 ? ?- : ?w),
(m & 0100 == 0 ? (m & 04000 == 0 ? ?- : ?S) :
(m & 04000 == 0 ? ?x : ?s)),
(m & 0040 == 0 ? ?- : ?r),
(m & 0020 == 0 ? ?- : ?w),
(m & 0010 == 0 ? (m & 02000 == 0 ? ?- : ?S) :
(m & 02000 == 0 ? ?x : ?s)),
(m & 0004 == 0 ? ?- : ?r),
(m & 0002 == 0 ? ?- : ?w),
(m & 0001 == 0 ? (m & 01000 == 0 ? ?- : ?T) :
(m & 01000 == 0 ? ?x : ?t)))
end
File.open(TMP, "w") do |permissions_file|
# TODO: Instead of the current dir, find the .git dir, which could be
# the same or outside of the current dir
Find.find(".") do |path|
next if IGNORE.collect {|ig| !!(path[2..-1] =~ /\A#{ig}/)}.include? true
next if File.symlink?(path)
stat = File.lstat(path)
type = stat.ftype[0..0].sub('f', '-') # Single character for the file type
# But a "-" istead of "f"
owner_id = stat.uid
group_id = stat.gid
rules = "#{type}#{numeric2human(stat.mode)}"
permissions_file.puts "#{path} #{rules} #{owner_id} #{group_id}"
end
end
`#{SORT} #{TMP} > ./fs-permissions`
`#{RM} #{TMP}`
- Вышеупомянутый скрипт должен выполняться в корне вашего рабочего каталога Git (GIT_WORK_TREE). Права доступа fs, владелец и групповые идентификаторы будут сохранены в файле
fs-permissions
в корне каталога GIT_WORK_TREE.
Скрипт: restore-fs-permissions
#!/usr/bin/ruby
# Restore from...
FROM = "./fs-permissions"
MKDIR = "/bin/mkdir"
CHMOD = "/bin/chmod"
CHOWN = "/bin/chown"
known_content_missing = false
def numeric2human(m)
return sprintf("%c%c%c%c%c%c%c%c%c",
(m & 0400 == 0 ? ?- : ?r),
(m & 0200 == 0 ? ?- : ?w),
(m & 0100 == 0 ? (m & 04000 == 0 ? ?- : ?S) :
(m & 04000 == 0 ? ?x : ?s)),
(m & 0040 == 0 ? ?- : ?r),
(m & 0020 == 0 ? ?- : ?w),
(m & 0010 == 0 ? (m & 02000 == 0 ? ?- : ?S) :
(m & 02000 == 0 ? ?x : ?s)),
(m & 0004 == 0 ? ?- : ?r),
(m & 0002 == 0 ? ?- : ?w),
(m & 0001 == 0 ? (m & 01000 == 0 ? ?- : ?T) :
(m & 01000 == 0 ? ?x : ?t)))
end
def human2chmod(mode)
raise unless mode =~ /([r-][w-][xtsTS-])([r-][w-][xtsTS-])([r-][w-][xtsTS-])/
triple = [$1, $2, $3]
u,g,o = triple.collect do |i|
i.sub('s', 'sx').sub('t', 'tx').downcase.gsub('-', '')
end
return "u=#{u},g=#{g},o=#{o}"
end
File.open(FROM).each do |permissions|
raise unless permissions =~ /\A(([^ ]*? )+)([^ ]+) ([^ ]+) ([^ ]+)\Z/
path, rules, owner_id, group_id = $1, $3, $4, $5
path = path.strip
owner_id = owner_id.to_i
group_id = group_id.to_i
if !File.exists?(path) and !File.symlink?(path)
if rules =~ /\Ad/
STDERR.puts "Restoring a missing directory: #{path}"
STDERR.puts "Probably it was an empty directory. Git goes not track them."
`#{MKDIR} -p '#{path}'` # Creating the any parents
else
known_content_missing = true
STDERR.puts "ERROR: Permission is listed but the file is missing: #{path}"
next
end
end
s = File.lstat(path)
t = s.ftype[0..0].sub('f', '-') # Single character for the file type
# But a "-" istead of "f"
# Actual, but not neccesarely Desired
actual_rules = "#{t}#{numeric2human(s.mode)}"
actual_owner_id = s.uid
actual_group_id = s.gid
unless [actual_rules, actual_owner_id, actual_group_id] ==
[rules, owner_id, group_id]
chmod_argument = human2chmod(rules)
# Debug
#p chmod_argument
#p s.mode
## Verbose
puts path
puts "Wrong: #{[actual_rules, actual_owner_id, actual_group_id].inspect}"
puts "Fixed: #{[rules, owner_id, group_id].inspect}"
puts
`#{CHOWN} #{owner_id}:#{group_id} '#{path}'`
`#{CHMOD} #{chmod_argument} '#{path}'`
#puts
end
end
if known_content_missing
STDERR.puts "-" * 80
STDERR.puts "Some files that are listed in #{FROM.inspect} are missing in " +
"the current directory."
STDERR.puts
STDERR.puts "Is #{FROM.inspect} outdated?"
STDERR.puts "(Try retrograding the current directory to an earlier version)"
STDERR.puts
STDERR.puts "Or is the current directory incomplete?"
STDERR.puts "(Try to recover the current directory)"
STDERR.puts "-" * 80
end