Я хочу иметь возможность запускать эту команду:
git diff --name-only HEAD $(git merge-base HEAD remotes/origin/dev)
Команда git merge-base дает сбой и ничего не возвращает — ни ошибок, ни чего-то еще. Ветка была создана на основе ветки dev, поэтому между ними существует общий коммит. Как мне выяснить, почему эта команда не работает и как заставить ее работать?
Команда работает на моем локальном компьютере, но не в этой другой среде.
Для устранения неполадок я выполнил следующие команды как на своем локальном компьютере, так и в другой среде:
Мой компьютер:
> git branch
* myBranch
> git show-ref remotes/origin/dev
6f5795fc6932784342adda78e2507a537beb72c3 refs/remotes/origin/dev
> git show-ref -h HEAD
2fd86bdba9eee8a7041045c96e0d37b3e7d28906 HEAD
6f5795fc6932784342adda78e2507a537beb72c3 refs/remotes/origin/HEAD
> git symbolic-ref HEAD
refs/heads/myBranch
> git rev-parse HEAD
2fd86bdba9eee8a7041045c96e0d37b3e7d28906
> git merge-base HEAD remotes/origin/dev
63ed7a1acdb477a37acba3cc1cdec33048adb260
> git diff --name-only HEAD $(git merge-base HEAD remotes/origin/dev)
myFile.xml
Другая среда:
> git branch
* myBranch
> git show-ref remotes/origin/dev
6f5795fc6932784342adda78e2507a537beb72c3 refs/remotes/origin/dev
> git show-ref -h HEAD
2fd86bdba9eee8a7041045c96e0d37b3e7d28906 HEAD
> git symbolic-ref HEAD
refs/heads/myBranch
> git rev-parse HEAD
2fd86bdba9eee8a7041045c96e0d37b3e7d28906
> git merge-base HEAD remotes/origin/dev
# exit code 1
> git diff --name-only HEAD $(git merge-base HEAD remotes/origin/dev)
# returns nothing
Что не так в другой среде? Должен ли я клонировать его по-другому? Различные настройки конфигурации git?
Я согласен.... Я готов поспорить, что проблема в предположениях, а не в git. Возможно, простое объяснение: история одной из ветвей была переписана?
@matt Команды отлично работают с теми же ветвями на моем локальном компьютере, но они не работают в контейнере в моем рабочем процессе CI/CD. Я обновил свой вопрос командами и результатами.
@eftshift0 это вполне возможно, но я недостаточно знаю git, чтобы понять, в чем именно проблема и как ее исправить.
git show-ref не показывает HEAD по умолчанию, вам нужно запросить его с помощью -h / --head. Несколько советов от опытного человека: замедлите проверку, вы недостаточно внимательно проверяете документы и доказательства, когда запутались. Ты показываешь каждый шаг, это хорошо, даже очень хорошо, но ты не проверяешь на каждом шагу, было ли то, что ты увидел, именно тем, что ты ожидал увидеть, и почему ты этого ожидал.
@jthill ок с -h, git show-ref теперь возвращает значение и не выдает ошибку
Проверьте историю обеих ветвей вручную (например, с помощью gitk)... вы будете шокированы, обнаружив, что они на самом деле не связаны (то есть с точки зрения коммитов... что и учитывает git при выполнении git merge-base).





Такая проблема может возникнуть, если у вас есть неглубокий клон для начала — и это настройка по умолчанию для многих конвейеров CI/CD (GitHub, gitlab, Azure DevOps...).
Чтобы подтвердить проблему:
проверьте, показывают ли следующие команды git log полную историю ветвей или одна история в какой-то момент обрезана:
git log --graph --oneline myBranch
git log --graph --oneline origin/dev
Чтобы решить проблему:
используйте git fetch --unshallow, например:
git fetch --unshallow origin myBranch
Еще лучше, пожалуй, было бы git log --graph --oneline myBranch origin/dev, т. е. построить график обеих ветвей и посмотреть, встречаются ли они. Именно это я имел в виду под «доказать использование графического интерфейса» в своем первоначальном комментарии.
@matt: Я согласен, я просто подумал, что будет легче определить, какой реферал был усечен, проверив две истории отдельно.
@LeGEC, спасибо! С помощью git log я смог увидеть, что в ветке origin/dev, по-видимому, не было всей истории, поэтому git fetch --unshallow исправил мою проблему.
@jeremywat: проверьте параметры конфигурации вашего конвейера ci, возможно, есть опция «мелкая» или «глубина выборки» или какой-то аналогичный термин, который активирует (или деактивирует) исходный мелкий клон.
Да, я удалил опцию глубины, поэтому не следует делать мелкое клонирование, я не знаю, почему это все еще происходит.
Да, если подумать, похоже, что глубина по умолчанию равна 1, что, вероятно, и произошло.
Можете ли вы доказать с помощью графического интерфейса, что HEAD и origin/dev имеют общего предка? Потому что я склонен верить Git; экстраординарное утверждение о том, что Git ошибается, требует экстраординарных доказательств.