git get force push history - PullRequest
       11

git get force push history

2 голосов
/ 12 марта 2019

Этот вопрос может быть повторен, но я не нашел точно такой же.

В репозитории git нашей команды QA я часто нахожу тестовые наборы, которые я добавил до того, как был потерян. и из истории главной ветки я больше не могу найти свой коммит.

Одна из причин была найдена, когда я сравнил журнал моей личной ветки и журнал основной ветки, и это был чей-то принудительный толчок, и парень признал, что он не очень знаком с git merge, но поспешил выдвинуть столь используемую опцию force.

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

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

Есть ли какие-нибудь способы получить принудительный журнал? обратите внимание, что как обычный сотрудник я не являюсь владельцем / администратором сервера git, но я забочусь о своих коммитах и ​​хочу, чтобы те, кто их удалял, были предупреждены.

Ответы [ 3 ]

2 голосов
/ 12 марта 2019

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

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

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

Вот почему git push -f опасный инструмент; и рискуя быть тупым, если понимание разработчиком git не дошло до такой степени, что они понимают, насколько это опасно, то этому разработчику не следует предоставлять доступ к принудительному толкованию ссылок, которыми делятся другие разработчики.

Вы можете настроить git remote на отклонение всех нажатий без ускоренной перемотки вперед (даже если принудительно); см. receive.denyNonFastForwards в git config документах.

Если вам нужен более точный контроль, вам снова придется полагаться на программное обеспечение хостинга для его предоставления.

1 голос
/ 12 марта 2019

Это довольно "хакерское" решение может быть полезно при поиске принудительных изменений, хотя я не уверен, будет ли оно работать во всех возможных ситуациях.

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

Обратите внимание, что для голых репозиториев необходимо включить reflogs .

В качестве примера предположим, что вы зафиксировали мастер, толкнул, затем исправил и силой толкнул - дважды.Тогда у вас будет всего четыре коммита (как видно из reflog), но только два в вашем реальном журнале:

$ git log -g master | grep ^commit # Show reflog of master
commit 3f52cea357aaa6ba9db86c1526b025a7ee2906c1 (refs/remotes/origin/master, refs/heads/master)
commit 5afa0cfe6e16d4d45088aeb226ed052a5ad72b87
commit 0334c6f8ba13c1465c855cf0b7cf6c79df487740
commit 8bb40a9d6da838e151c8653b8d6be2b7afeb1902

$ git log master | grep ^commit    # Show log of master
commit 3f52cea357aaa6ba9db86c1526b025a7ee2906c1 (refs/remotes/origin/master, refs/heads/master)
commit 0334c6f8ba13c1465c855cf0b7cf6c79df487740

$ git reflog                       # for reference - HEAD@{0, 2} were force pushes
3f52cea (HEAD -> refs/heads/master) HEAD@{0}: push
5afa0cf HEAD@{1}: push
0334c6f HEAD@{2}: push
8bb40a9

В bash я могу показать разницу между ними (используя подстановку процесса):

$ diff <(git log -g master | grep ^commit) <(git log master | grep ^commit) | grep "^<"
< commit 5afa0cfe6e16d4d45088aeb226ed052a5ad72b87
< commit 8bb40a9d6da838e151c8653b8d6be2b7afeb1902

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

1 голос
/ 12 марта 2019

Вы не сможете получить историю силового толчка, но вы по крайней мере сможете шпионить за своими коммитами, которые были забиты. Из вашего локального клона используйте git fsck:

 (master) :~/repo$ git fsck --lost-found
Checking object directories: 100% (256/256), done.
dangling blob 6edc1e217eaab8f72f67bcec2e4d1dfde299971e
dangling commit 9847c5942bf477989112ece202988bc3f8caad05
 (master) :~/repo$ git merge 9847c59
     // ... conflicts likely appear ... //

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

...