2010-07-29 2 views
9

У меня есть центральный репозиторий с подмножеством файлов, которые я хочу защитить от изменения (путем нажатия) от других пользователей. Если я добавлю эти файлы в .gitignore, они не будут клонированы.Защита файлов в репозитории git

Можно ли клонировать все файлы, но после клонирования добавить некоторые из них в .gitignore на стороне клиента?

+0

Является ли .gitignore в хранилище? Почему вы хотите защитить эти файлы? Добавляет ли .gitignore какой-либо доступ для каждого пользователя, или ваше изменение означает, что * nobody * может изменить эти файлы? Что вы пытаетесь достичь? –

+0

Можно ли просто отказаться от нажатий, которые изменяют эти файлы? Вы также можете предложить крючок на стороне клиента, чтобы отклонить плохие коммиты. – Cascabel

ответ

0

Первоначально я думал о filter driver (см Pro Book), которая:

  • на этапе смазывания сохранить содержимое файлов
  • на чистый шаге будет восстановить содержимое файлов.

alt text

Но это не является хорошим решением, так как эти сценарии о без гражданства файл содержание преобразование (см this SO answer).

Вы можете попытаться применить механизм сохранения/восстановления в перехватах (см. Тот же ответ SO), но обратите внимание, что он будет локальным для вашего репо (он будет защищать ваши файлы только в вашем репо, крючки не будут нажаты)

Вы также можете использовать:

git update-index --assume-unchanged file 

Смотрите "With git, temporary exclude a changed tracked file from commit in command line", опять-таки только локальная защита. Это защитит их от внешнего нажатия на ваш репо («импорт»), но если вы опубликуете их («экспорт»), то могут быть изменены на стороне клиента.

+0

Спасибо. Я знаю о git update-index -assume-unchanged, но применяется только на стороне клиента. Я знаю также о крючках, но они не клонированы из центрального репо. – andrexus

+0

@andrexus: Я знаю: фильтр-драйвер является единственным разрешимым решением, но ему потребуется сгибать скрипт smudge, чтобы он знал о пути к соответствующим файлам (для сохранения/восстановления), тогда как он должен знать только о содержании файлов ... – VonC

1

Есть ли конкретная причина, по которой Git должен сам быть ответом на это?

Как сделать файлы доступными только для чтения и продиктовать политику, что эти файлы не следует выталкивать?

Иногда технологическое решение не является самым простым способом.

Если кто-то делает push изменения этих файлов, эти изменения всегда могут быть возвращены.

1

Вы можете иметь файлы в репозитории, зафиксировать их, а затем добавить их в .gitignore, а затем удалить их из следующей фиксации.

Вы по-прежнему можете получить файлы непосредственно перед фиксацией (возможно, пометить его чем-то, чтобы его можно было выбрать по имени немного проще), и это сохранит состояние файла, не сделав его легко отредактированным в репозитории авария.

Чтобы получить доступ к этим файлам после вытаскивания клона, просто напишите команду rake, которая выберет их для пользователя вашего репозитория.

1

Мне кажется, что проблема кроется в другом месте, если вам нужен этот уровень ограничения доступа.

Тем не менее, если вы действительно хотите это реализовать, рассмотрите Gitolite. Это позволяет вам определять довольно подробные правила доступа и, вероятно, достаточно для ваших нужд.

Gitolite документация: http://gitolite.com/gitolite/master-toc.html

Вы можете определить «виртуальные рефов» для управления доступом на уровне файлов. Подробнее об этом: http://gitolite.com/gitolite/vref.html

Смежные вопросы