Не удается определить восходящую информацию SVN из истории головы


Почему я получаю это сообщение об ошибке?

10 58

10 ответов:

(опубликовано "вопрос" чада в качестве ответа, исправлено форматирование и опечатки.)

есть несколько причин для этого сообщения об ошибке.

первый, самый распространенный. У вас есть две непересекающиеся истории в репозитории git: история, которую вы сделали в git, и история из удаленного репозитория svn.

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

далее статьи, обсуждает, как исправить проблему:

вторая возможная причина проблемы заключается в том, что у вас есть ранняя версия git (возможно, пакет Windows msysGit), и вы только что создали новый репозиторий git, который взаимодействует с удаленным репозиторием svn.

например:

git svn init svn://svn.xxx.xxx/xxx/trunk
git svn fetch -r BASE:10

или

git clone svn://svn.xxx.xxx/xxx/trunk // Adds all the files in the revision...

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

git svn info

не удается определить восходящую информацию svn из рабочего дерева или

git svn rebase

не удается определить восходящую информацию svn рабочей истории дерева или

  git svn dcommit

не удается определить восходящую информацию SVN из истории головы

если вы получаете вышеуказанные сообщения об ошибках, первым шагом является проверка версии git. Если вы используете более старую версию git

далее статьи обсуждает проблему более подробно.

я получил это сообщение из-за клонирования РЕПО svn с . Может быть, это относится и к вашей проблеме тоже.

при клонировании его без этой опции все в порядке.

The --no-metadata опция предназначена для клонирования репозитория SVN, когда новый git клон должен стать каноническим источником в будущем. Ему не хватает возможностей для фиксации обратно в SVN вверх по течению, потому что у него нет способа отслеживать различия между клоном git и SVN восходящий поток.

в моем случае голова из РЕПО svn должна была быть сопоставлена с головой из РЕПО git. этой необходимо решить проблему:

git update-ref refs/remotes/git-svn refs/remotes/origin/master

я получил это сообщение после того, как я неправильно добавил -s/ до git svn clone команда для РЕПО Subversion, которая сделала не есть "стандартный макет Subversion"trunk,tags и branches относительные пути.

(репозитории Subversion, которые я обычно клонирую, имеют стандартные относительные пути, поэтому, когда я клонировал репозиторий Subversion, у которого их не было, используя мой обычный git svn clone команда, я получил это загадочное сообщение. Сообщение является 100% правильным, но почти 100% бесполезно при попытке выяснить, в чем проблема.)

получил ту же проблему, вот решение на основе http://eikke.com/importing-a-git-tree-into-a-subversion-repository/ статья:

$ git svn init http://server.com/svn/project/trunk/prototypes/proto1/
$ git svn fetch
  W: Ignoring error from SVN, path probably does not exist: (160013): Filesystem has no item: '/svn/!svn/bc/100/dcom/trunk/prototypes/ws' path not found
  W: Do not be alarmed at the above message git-svn is just searching aggressively for old history.
  This may take a while on large repositories
  r147367 = 37c9910f794cb9cff7ca0d5d2eb26e1f0dabbc4d (refs/remotes/git-svn)
$ svn log http://server.com/svn/project/trunk/prototypes/proto1/
  ------------------------------------------------------------------------
  r147367 | user | 2014-01-16 18:02:43 +0100 (Thu, 16 Jan 2014) | 1 line
  proto1 home
  ------------------------------------------------------------------------
$ git log --pretty=oneline master | tail -n1
  71ceab2f4776089ddbc882b8636aacec1ba5e832 Creating template
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #1

$ git show-ref git-svn
  37c9910f794cb9cff7ca0d5d2eb26e1f0dabbc4d refs/remotes/git-svn
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #2

$ echo "71ceab2f4776089ddbc882b8636aacec1ba5e832 37c9910f794cb9cff7ca0d5d2eb26e1f0dabbc4d" >> .git/info/grafts

$ git svn dcommit
  Committing to http://server.com/svn/project/trunk/prototypes/proto1 ...
    A   README.md
    A   pom.xml
A   src/main/java/.gitkeep
A   src/main/resources/.gitkeep
A   src/main/webapp/WEB-INF/web.xml
A   src/main/webapp/index.html
A   webapps/.gitkeep
  Committed r147419
    A   README.md
    A   pom.xml
A   src/main/java/.gitkeep
A   src/main/resources/.gitkeep
A   src/main/webapp/WEB-INF/web.xml
A   src/main/webapp/index.html
A   webapps/.gitkeep
  r147419 = 6a8bda7262739306d0a6e17eaad2802737dedc35 (refs/remotes/git-svn)
  No changes between current HEAD and refs/remotes/git-svn
  Resetting to the latest refs/remotes/git-svn
  Unstaged changes after reset:
    M   pom.xml
    M   src/main/webapp/index.html
    A   .gitignore
  Committed r147420
    M   pom.xml
    M   src/main/webapp/index.html
    A   .gitignore
  r147420 = 749b5acec55c341672bca08d07de8c336b5a4701 (refs/remotes/git-svn)
  No changes between current HEAD and refs/remotes/git-svn
  Resetting to the latest refs/remotes/git-svn
  ...etc...

вы также можете получить эту ошибку, когда у вас есть проверка недавно созданного РЕПО SVN.

Я решил это с помощью

  1. Сначала делаем начальную фиксацию с помощью команды svn
  2. затем клонировать репозиторий с помощью команды git в SVN.

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

The git-svn-id строка в ваших коммитах, импортированных из Subversion, должна соответствовать rewriteRoot URL, если он установлен.

я получил это сообщение, потому что я использовал доменное имя git svn init команда, но уже существующая интеграция git-svn использовала только имя хоста.

например.grep git-svn-id показал:

git-svn-id: svn://host/repo/...

а я:

git svn init -Ttrunk svn://host.domain.com/repo

(у нас есть машина, которая регулярно синхронизирует git repo с svn, тогда у всех остальных есть git config --add remote.origin.fetch refs/remotes/*:refs/remotes/* чтобы получить вниз svn синхронизированные ветви.)

другая возможная причина: Если у вас есть SVN-remote..rewriteUUID config set, git-svn может иметь проблемы с поиском правильных метаданных для репозитория. Например, у вас может быть что-то вроде этого (см. справочную страницу git-svn для обсуждения того, почему вы хотите это сделать):

[svn-remote "svn"]
    url = svn://read-write.test.org
    fetch = trunk/project:refs/remotes/trunk
    rewriteRoot = http://read-only.test.org/svn
    rewriteUUID = 1234-abcd

... где 1234-abcd-это UUID зеркала только для чтения. Когда вы 'git svn fetch', вы можете получить этот файл:

.git/svn/refs/remotes/trunk/.rev_map.5678-dcba

... где 56780-dcba является UUID чтение-запись репозитория. Исправление заключается в следующем:

$ mv .git/svn/refs/remotes/trunk/.rev_map.5678-dcba \
    .git/svn/refs/remotes/trunk/.rev_map.1234-abcd

не могу сказать наверняка, является ли это долгосрочным решением, т. е. он может запутаться в следующий раз, когда вы "git svn fetch". Может попробовать символическую ссылку, а не "mv", я не экспериментировал с этим.

я увидел это после того, как я использовал BFG Repo-Cleaner https://rtyley.github.io/bfg-repo-cleaner/ и переписал историю git (намеренно), а затем попытался снова получить git svn. Сообщение показывает, что соответствие git svn потеряно.

чтобы решить эту проблему, прочитайте https://git-scm.com/docs/git-svn
В самом низу показано:

$GIT_DIR / svn/*/.rev_map.

сопоставление между версиями Subversion номера и имена фиксации Git. В репозитории, где noMetadata опция не установлена, это можно перестроить из git-svn-id: линии, которые находятся в конце каждого коммита (см. svn.выше в разделе noMetadata относительно деталей.)

для этого вам нужно иметь комментарии git-svn-id в комментариях commit. Если вы это сделаете, вы можете удалить .rev_map.* файл и перестроить его.

rm .git/svn/refs/remotes/git-svn/.rev_map.*
git svn info

Это должно показать:

Rebuilding .git/svn/refs/remotes/git-svn/.rev_map.{snip} ...
...
Done rebuilding .git/svn/refs/remotes/git-svn/.rev_map.{snip}
Path: .
...and then regular git svn info output