fragen stichworte

Push-Commits für git (gitolite) Repository führt zu Dateiberechtigungen (kein Trac-Zugriff mehr)

hat bereits hier gepostet, also können Sie dort gerne antworten.

Jedes Mal, wenn ich etwas an den Git-Server übergebe oder drücke, ändern sich die Dateiberechtigungen (alle hinzugefügten/bearbeiteten Dateien im Repository haben keinen Lese- und Ausführungszugriff für die Gruppe). Daher kann Trac nicht auf das Repository zugreifen.

Muss ich die Berechtigungen des Ordners anders ändern?

chmod u=rwx,g=rx,o= -R/home/git/repositories

oder muss ich gitolite irgendwie einrichten, um dateien mit unterschiedlichen berechtigungen zu schreiben ???

Grüße Kinder

antworten

Die Einstellung von umask/default umask hat keine Auswirkungen, da Gitolit seine eigenen Einstellungen hat.

um ~/.gitolite.rc

$REPO_UMASK = 0027;

stellen Sie es wie gewünscht ein :)

Git verfolgt nur Dateinamen und die Daten dieser Dateien. Es erfasst keine Metadaten des Dateisystems (ownreship, Berechtigungen, ...).

Ein umask kann eine effektive Lösung sein, wenn Sie möchten, dass alle Dateien die gleichen Berechtigungen haben.

Ich habe seit 3 ​​Jahren Systemdateien auf mehreren Servern mit Git verfolgt. Ich brauchte eine Möglichkeit, die Änderungen an Berechtigungen sowie die Daten zu verfolgen. Ich habe ein Ruby-Skript geschrieben, um Dateiberechtigungen/Besitzrechte zu erfassen und in eine Datei einzufügen. Diese Datei kann jetzt von git verfolgt werden. Wenn diese Metadaten wiederhergestellt werden müssen, verwende ich ein anderes Ruby-Skript, das die Datei liest und die Berechtigungen wiederherstellt.

Ich verwende dieses Skript 3 Jahre lang regelmäßig und hat mich nicht im Stich gelassen.

Hier sind sie:

Skript: 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}`
  • Das obige Skript wird im Stammverzeichnis Ihres Git-Arbeitsverzeichnisses (GIT_WORK_TREE) ausgeführt. Die Berechtigungen, Eigentümer und Gruppen-IDs von fs werden in der Datei fs-permissions im Stammverzeichnis des Verzeichnisses GIT_WORK_TREE gespeichert.

Skript: 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