Git репозиторий уникальный идентификатор - PullRequest
5 голосов
/ 14 февраля 2011

Мне нужно выяснить, принадлежит ли коммит определенному git-репозиторию.

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

Например, взять SHA начального набора изменений.Может ли он однозначно идентифицировать хранилище?

Ответы [ 5 ]

4 голосов
/ 14 февраля 2011

Ключ SHA1 предназначен для идентификации содержимого (большого двоичного объекта или дерева), а не для хранилища.
Если содержимое отличается от репо к репо, то его история не имеет общего предка, поэтому я не думаю, что будет работать решение на основе наборов изменений.

Возможно (не проверено) вы могли бы добавить маркер (без необходимости менять все SHA1) через git notes .
Смотрите, например, GitHub deploy-notes , который использует этот механизм для отслеживания развертываний.

1 голос
/ 14 февраля 2011

(перенесено из комментария)

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

0 голосов
/ 23 октября 2015

Сравните с Mercurial, где проверки mercurial/treediscovery.py ( Идентификатор хранилища Mercurial ):

base = list(base)
if base == [nullid]:
    if force:
        repo.ui.warn(_("warning: repository is unrelated\n"))
    else:
        raise util.Abort(_("repository is unrelated"))

base переменная хранит последние общие части двух хранилищ.

Git имеет те же предположения, когда выбрасывает warning: no common commits при извлечении / отправке.Я просто не нашел в Git исходники, которые требуют времени.

Давая идею Mercurial push / pull проверок, мы можем предположить, что репозитории связаны, если они имеют общие корни.Для mercurial это означает, что хеши из команды:

$ hg log -r "roots(all())"

для обоих репозиториев должны иметь непустое междометие.

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

0 <--- SHA-256-XXX <--- SHA-256-YYY <--- SHA-256-ZZZ
0 <--- SHA-256-YYY <--- SHA-256-ZZZ

невозможно, потому что это означает, что вы отменяете SHA-256, поскольку каждый последующий хеш зависит от предыдущих значений.Это верно как для Mercurial, так и для Git.

Соответствующая команда для просмотра корней в Git:

$ git log --format=oneline --all --max-parents=0

Вы можете играть с:

bash# md git
/home/user/tmp/git

bash# md one
/home/user/tmp/git/one

bash# git init
Initialized empty Git repository in /home/user/tmp/git/one/.git/

bash# echo x1 > x1
bash# git add x1
bash# git ci -m x1
[master (root-commit) 1208fb0] x1

bash# echo x2 > x2
bash# git add x2
bash# git ci -m x2
[master 1c3fe86] x2

bash# cd ..

bash# md two
/home/user/tmp/git/two

bash# git init
Initialized empty Git repository in /home/user/tmp/git/two/.git/

bash# echo y1 > y1
bash# git add y1
bash# git ci -m y1
[master (root-commit) ff56a8e] y1

bash# echo y2 > y2
bash# git add y2
bash# git ci -m y2
[master 18adff5] y2

bash# git fetch ../one/
warning: no common commits
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From ../one
 * branch            HEAD       -> FETCH_HEAD

bash# git co --orphan one
Switched to a new branch 'one'

bash# git merge FETCH_HEAD

bash# git log --format=oneline --all
18adff541c7ce9f1a1f2be2804d6d0e5792ff086 y2
ff56a8e7e9145d2b1b5a760bbc9b12451927ab0c y1
1c3fe8665851e89d37f49633cd2478900217b91c x2
1208fb0f721005207c6afe6a549a9ed0dcc5b0a8 x1

bash# git log --format=oneline --all --max-parents=0
ff56a8e7e9145d2b1b5a760bbc9b12451927ab0c y1
1208fb0f721005207c6afe6a549a9ed0dcc5b0a8 x1

bash# git log --all --graph

* commit 18adff541c7ce9f1a1f2be2804d6d0e5792ff086
|     y2
|  
* commit ff56a8e7e9145d2b1b5a760bbc9b12451927ab0c
      y1

* commit 1c3fe8665851e89d37f49633cd2478900217b91c
|     x2
|  
* commit 1208fb0f721005207c6afe6a549a9ed0dcc5b0a8
      x1

NOTE Git разрешить частичную проверку.Я не проверял этот случай на --max-parents=0.

0 голосов
/ 22 сентября 2011

В Rietveld мы не можем заставить всех использовать «заметки git», когда люди хотят найти отзывы, сделанные на их репозиториях, поэтому мы собираемся использовать последний хеш из вывода git rev-list --parents HEAD.

0 голосов
/ 14 февраля 2011

Вы можете использовать git filter-branch для поиска коммита, который вы ищете.

Хэш начального коммита не дает много информации о самом репозитории. Нет способа однозначно идентифицировать хранилище.

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