git local repo получил последнюю фиксацию с удаленного компьютера, но не смог ее записать

На одной машине журнал git показывает, что он не получает последние коммиты из удаленного репо (после запуска 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

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

------- Обновить -----------

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

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

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/develop показывает, что только у парня Гунцяна изначально было разрешение на запись (потому что именно он запустил git checkout ветку разработки). Именно он запустил git pull, чтобы получить последний коммит 4b45d4b.
  2. После того, как я запустил статус git, он сказал: «Ваша ветка опережает« происхождение / разработка »на 1 фиксацию», я проверил этот файл. Он НЕ записал последний рывок. Но так как именно этот парень владеет файлом и запускает этот git pull. Почему git не смог это записать?
  3. Я изменяю этот файл, чтобы разрешить запись всем, и снова запускаю git pull, чтобы исправить это. Но я очень сомневаюсь, что это "правильное" решение.

Еще один вопрос, возникший здесь, заключается в том, что это ветка, которую 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, чтобы убедиться.


person Qiulang    schedule 31.01.2019    source источник
comment
вы пробовали git fetch на машине, где вы не получаете последнюю фиксацию? вообще git fetch git pull должно помочь.   -  person Hiren    schedule 31.01.2019
comment
Да, я запускаю git fetch и git pull. Это не решило проблему.   -  person Qiulang    schedule 31.01.2019


Ответы (1)


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

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

. Но я хотел знать, почему статус git говорит, что «ваша ветка опережает« происхождение / разработка »на 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, чтобы новые файлы создавались с разрешениями на запись группы.
  • или настроить расширенный ACL для группы, чтобы члены группы могли читать/записывать/получать доступ к любым файлам, которые уже есть.
person VonC    schedule 31.01.2019
comment
Он действительно запускал git pull от имени пользователя root, а затем изменил права доступа к некоторым файлам. Но я хотел знать, почему статус git сказал, что ваша ветка опережает «происхождение/развитие» на 1 коммит. в то время как мы использовали git pull, чтобы получить этот коммит из источника - person Qiulang; 31.01.2019
comment
@Qiulang Если он показывает, что ваша ветка опережает «origin/develop» на 1 фиксацию, это означает, что самая последняя фиксация еще не отправлена ​​или удаленная ветвь еще не выбрана, чтобы отразить эту последнюю фиксацию. - person VonC; 31.01.2019
comment
Я думаю, вы не поняли мой вопрос. На машине мы использовали git pull origin development для получения последней фиксации из источника. Затем мы запускаем git status на этой машине, и, к нашему удивлению, он показывает, что ваша ветка опережает «origin/develop» на 1 коммит. - person Qiulang; 31.01.2019
comment
@Qiulang Опять же, это означает, что самая последняя фиксация еще не отправлена ​​​​в источник / разработку. - person VonC; 31.01.2019
comment
НЕТ, самая последняя фиксация 4b45d4b была отправлена ​​в Origin/Development. Именно поэтому на другой машине он может получиться! - person Qiulang; 31.01.2019
comment
@Qiulang Мы говорим об одном и том же 4b45d4b? Это означает, что полный SHA1 источника/развития HEAD совпадает с 4b45d4bfff7c54169fea7343c5b4f020be556d0a? - person VonC; 31.01.2019
comment
Да. И именно поэтому я задал вопрос в первую очередь! - person Qiulang; 31.01.2019
comment
Проблемный сервер — это наш промежуточный сервер. Это только код git pull из источника, чтобы выполнить тест. После того, как мы запустили git pull последнего коммита 4b45d4b, я запускаю git status просто для того, чтобы убедиться, что мы ничего не изменили. Затем, к моему удивлению, мы обнаруживаем, что ваша ветка опережает «происхождение/развитие» на 1 коммит. - person Qiulang; 31.01.2019
comment
@Qiulang, это должно быть следствием проблемы с разрешениями, не позволяющей этому серверу правильно записать последнюю фиксацию, полученную для origin/develop. - person VonC; 31.01.2019
comment
@Qiulang Хорошо, я отредактировал ответ, чтобы ответить на дополнительный вопрос. - person VonC; 31.01.2019
comment
Я все еще думаю, что есть вопросы без ответа. Пожалуйста, проверьте мой вопрос об обновлении. На самом деле я уже догадываюсь о причине (на что вы ответили), когда меняю разрешение файла. - person Qiulang; 31.01.2019
comment
Честно говоря, я считаю, что мой парень просто sudo git pull и, вероятно, невозможно (или не стоит усилий) выяснить, почему парень, которому принадлежал этот файл, не позволил git обновить его. - person Qiulang; 31.01.2019
comment
@Qiulang Я понимаю, но исправление разрешения группы, как описано в serverfault.com/a/27040/783, чище. Кроме того, ни у кого из моих пользователей не будет доступа к sudo для этой команды. - person VonC; 31.01.2019