git local repo получил последний коммит с удалённого компьютера, но не смог его записать - PullRequest
0 голосов
/ 31 января 2019

На одном компьютере git log show не получает последние коммиты из удаленного репо (после запуска git pull)

git log --oneline -n 3 origin/develop
5a8e6eb xxx
7547c8a xxx
53294b6 xxx

На другом компьютере, правильном, он получает последний коммит 4b45d4b

git log --oneline -n 4 origin/develop
4b45d4b (origin/gq_dev, origin/develop) xxx
5a8e6eb (tag: dev_12) xxx
7547c8a xxx
53294b6 (origin/zsf) xxx

Что странно на проблемной машине, так это то, что мой парень сказал, что он на самом деле использовал git pull origin pull, чтобы получить последний коммит 4b45d4b из источника.Поэтому, когда запускается git status, он показывает: «Ваша ветвь опережает« происхождение / развитие »на 1 коммит».

git status
# On branch develop
# Your branch is ahead of 'origin/develop' by 1 commit.
...

git show
commit 4b45d4bfff7c54169fea7343c5b4f020be556d0a

Так что же произошло и как мне это исправить?

------- update -----------

Я случайно исправил это, не зная, почему, поэтому я добавил разрешение на запись для всех в .git / logs / refs / remotes/ origin / development file

Первоначально это было

ls .git/logs/refs/remotes/origin/develop
-rw-rw-r-- 1 gongqiang     gongqiang      2103 Jan 30 19:07 develop

После добавления разрешения на запись и запуска git pull снова проблема исправлена!Но я до сих пор не знаю, почему.

----- обновление 2 ------

Ответ, который я получил от VonC, пролил свет на эту проблему, но все еще естьвопросы остались без ответа.

  1. ls .git / logs / refs / remotes / origin /velop показывают, что только у парня gongqiang изначально было разрешение на запись (б / к именно он запустил git checkout в ветви разработки),Именно он запустил git pull для получения последнего коммита 4b45d4b.
  2. После того, как я запустил git status, он сказал: «Ваша ветвь опережает« origin / development »на 1 коммит».Это НЕ записывало последнюю тягу.Но так как этот парень владеет файлом и запускает этот мерзавец.Почему git не удалось его записать?
  3. Я изменяю этот файл, чтобы разрешить кому-либо запись, и снова запускаю git pull, чтобы это исправить.Но я действительно сомневаюсь, что это «правильное» исправление.

Еще один вопрос, поднятый здесь, заключается в том, что это ветвь, которую может потянуть один человек (ветвь интеграции для тестирования).Лучше использовать sudo git pull или изменить разрешение на запись, чтобы другие запускались git pull без sudo

---- обновление 3 -----

Я принял VonC ответ иссылка, которую он предоставил в коммитах https://serverfault.com/questions/26954/how-do-i-share-a-git-repository-with-multiple-users-on-a-machine/27040#27040, полезна.

Но мне также нужно было указать, что, вероятно, невозможно (или не стоит затраченных усилий) выяснить, почему тот, кто владел .git/logs/refs/remotes/origin/develop, не позволил git обновить его при запуске git pull.

Итак, урок, который я усвоил здесь, когда обнаружил, что git status сказал что-то странное, проверьте с помощью .git/logs/refs/remotes/origin/develop/branch, чтобы подтвердить

1 Ответ

0 голосов
/ 31 января 2019

Это может быть случай запуска ( как здесь ) git pull от имени root в прошлом, при изменении разрешения / владельца некоторых файлов.

Чтобы быть уверенным, что вы работаете с последовательным репо, просто клонируйте его снова и отметьте в этом клоне, что git log --oneline -n 3 origin/develop возвращает ожидаемые коммиты.

.Но я хотел знать, почему в git status говорится: «Ваша ветвь опережает« происхождение / развитие »на 1 коммит».в то время как мы использовали git pull, чтобы получить этот коммит из источника

Полагаю, проблема с разрешениями (которую вы исправили) помешала Git записать последний SHA1 для origin/develop.
Но : эта последняя фиксация все еще была выбрана, и ваша ветвь develop все еще была быстро переадресована на последнюю версию SHA1 (4b45d4b)

, поскольку локальная ветвь указывает на 4b45d4b, но .git/logs/refs/remotes/origin/develop по-прежнему ссылаясь на предыдущий коммит (потому что он не был обновлен должным образом), вы получите

# Your branch is ahead of 'origin/develop' by 1 commit.

Еще один вопрос, поднятый здесь, так как это ветвь, которая будет больше одного человекаgit pull (ветвь интеграции для тестирования).
Лучше использовать sudo git pull или изменить разрешение на запись, чтобы другие могли просто запустить git pull

Как объяснил здесь , вы можете:

  • либо изменить разрешения группы, а затем изменить umask для пользователей на 002, чтобы новые файлы создавались с разрешениями на запись в группу.
  • или настройка расширенийnded ACL для группы, чтобы члены группы могли читать / записывать / получать доступ к любым файлам, которые там уже есть.
...