Назад | Перейти на главную страницу

push коммитов в репозиторий git (gitolite) портит права доступа к файлам (больше нет доступа к трассировке)

уже опубликовано Вот так что не стесняйтесь отвечать там.

каждый раз, когда я фиксирую / отправляю что-то на сервер git, права доступа к файлам меняются (все добавленные / редактируемые файлы в репозитории не имеют доступа на чтение и выполнение для группы). таким образом, trac не может получить доступ к репозиторию.

мне нужно по-другому изменить права доступа к папке?

chmod u = rwx, g = rx, o = -R / home / git / репозитории

или мне нужно как-то настроить гитолит для записи файлов с разными разрешениями ???

С уважением, Клеменс

установка 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