Запретить или предотвратить переписывание истории в локальном репозитории git - PullRequest
0 голосов
/ 18 марта 2019

Я хочу запретить или предотвратить переписывание истории в локальном репозитории git.Я знаю, что могу добиться этого в удаленном репозитории, используя:

git config --system receive.denyNonFastforwards true
git config --system receive.denyDeletes true

Но это работает только на сервере git (не локальном репо).

Как отключить изменение и перебазирование на локальном gitСделки рЕПО?Что-то вроде:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    denyRebase = true <--
    denyAmend = true <---
[receive]
    denyNonFastforwards = true
    denyDeletes = true

Обновление: мои намерения

Мы разрабатываем приложение, которое похоже на предотвращение плагиата.Он будет записывать всю историю файлов с определенным интервалом и другую информацию во время рабочих заданий.Таким образом, мы можем проанализировать эту историю с помощью некоторой формулы, а затем принять решение о подозреваемом ученике, который плагиат.Репозиторий .git будет заархивирован вместе с заданием и отправлен нам.Сейчас мы пересматриваем лучший подход, чтобы предотвратить любую возможность переписывания истории.Вот некоторые из наших кандидатов: 1. Направить локальную фиксацию в наше удаленное репо через определенный интервал 2: раскройте git и отбросьте эту функцию.

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Мне было бы интересно узнать больше о вашем использовании git;особенно, какие особенности полезны для вашего варианта использования.


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

Вы можете прочитать главы "Git Internals" git.book (например: 10.2 Git Internals - Git Objects ) или эта ссылка: Напишите себе Git! , где автор проведет вас через реализацию основных функций gitс помощью внешних сценариев.

  • если вам просто нужно быть уверенным, что люди не делают commit --amend или rebase в этом репо, я бы порекомендовал вам предоставить набор сценариев, которыеопишите действия, которые должны быть разрешены людям, и укажите, что это должны быть единственные способы использования этого репо;

  • , если вы хотите , абсолютно убедитесь, что никто не делаетэто , я бы сказал, что git не приспособлен к этой цели;вы можете по крайней мере заставить людей взаимодействовать с удаленным репо и лучше контролировать то, что происходит в этом удаленном репо.

0 голосов
/ 18 марта 2019

Предотвратить ребазинг легко.Создайте pre-rebase крючок, который всегда делает exit 1.

Предотвращение изменения сложнее, поскольку прямого крючка нет.Вы можете попытаться злоупотребить prepare-commit-msg, убедиться, что второй аргумент равен commit и выйти с ошибкой:

test "$2" = commit && exit 1

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

Обновление .О, вы хотите остановить враждебных сотрудников (студентов).Это почти невозможно.Враждебные студенты могут делать почти все в своих локальных хранилищах.Они могут отключить хуки, у них может быть два хранилища - одно для грязной работы и одно чистое;рабочий процесс: редактировать в грязном репо, вытащить, чтобы очистить, нажать на сервер.Невозможно обнаружить что-либо в локальном репо, и нет способа обнаружить поправку, даже получив весь .git/.Регулярные отправки на сервер с отключенным принудительным нажатием немного увеличивают ваши шансы поймать враждебного ученика, но не намного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...