Можно ли выбрать фиксацию из другого репозитория git?



Я работаю с репозиторием git, который нуждается в фиксации из другого репозитория git, который ничего не знает о первом.



обычно я бы вишневый выбор с помощью HEAD@{x} в reflog, но ведь это .git ничего не знает об этой записи reflog (различные физические каталога), как я могу выбрать это, или я могу?



Я использую git-svn. Моя первая ветка использует git-svn на trunk из репозитария, а в соседней ветке использует git-svn на a Ветка подрывной деятельности.

681   10  

10 ответов:

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

вот так:

git remote add other https://example.link/repository.git
git fetch other

теперь у вас есть вся информация, чтобы просто сделать git cherry-pick.

подробнее о работе с пультами ДУ здесь:https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes

ответ, как указано, заключается в использовании format-patch, но поскольку вопрос заключался в том, как выбрать вишню из другой папки, вот фрагмент кода, чтобы сделать именно это:

$ git --git-dir=../<some_other_repo>/.git \
format-patch -k -1 --stdout <commit SHA> | \
git am -3 -k

(объяснение от @cong ma)

The git format-patch команда создает Патч от some_other_repo ' s совершение указанного ша (-1 только один коммит). Этот патч передается в git am, который применяет патч локально (-3 означает попытка трехстороннего слияния, если патч не удается применить чисто). Надеяться это все объясняет.

вот пример удаленного извлечения слияния.

cd /home/you/projectA
git remote add projectB /home/you/projectB
git fetch projectB

затем вы можете:

git cherry-pick <first_commit>..<last_commit>

или вы могли бы даже объединить всю ветку

git merge projectB/master

вы можете сделать это, но это требует двух шагов. Вот как:

git fetch <remote-git-url> <branch> && git cherry-pick FETCH_HEAD

заменить <remote-git-url> С url-адресом или путем к репозиторию, из которого вы хотите выбрать вишню.

заменить <branch> С именем ветки или тега, которое вы хотите выбрать из удаленного репозитория.

вы можете заменить FETCH_HEAD С git SHA из ветки.

Обновлено: изменено на основе обратной связи @pkalinow.

вот шаги для добавления удаленного, выборки ветвей и вишневого выбора фиксации

# Cloning our fork
$ git clone [email protected]:ifad/rest-client.git

# Adding (as "endel") the repo from we want to cherry-pick
$ git remote add endel git://github.com/endel/rest-client.git

# Fetch their branches
$ git fetch endel

# List their commits
$ git log endel/master

# Cherry-pick the commit we need
$ git cherry-pick 97fedac

Источник:https://coderwall.com/p/sgpksw

посмотреть Как создать и применить патч с помощью Git. (Из формулировки вашего вопроса, я предположил, что этот другой репозиторий на совершенно другой кодовой базе. Если это репозиторий для той же базы кода, Вы должны добавить его в качестве удаленного, как предложено @CharlesB. Даже если это для другой базы кода, я думаю, вы все равно можете добавить его как удаленный, но вы не можете получить всю ветку в свой репозиторий...)

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

git fetch ssh://[email protected]:7999/repo_to_get_it_from.git branchToPickFrom && git cherry-pick 02a197e9533

git fetch [филиал адрес URL][ветка к вишне-выбрать из] & & git cherry-pick [commit ID]

да. Возьмите репозиторий, а затем вишневый выбор из удаленной ветви.

моя ситуация заключалась в том, что у меня есть голое РЕПО, к которому подталкивает команда, и клон, который сидит рядом с ним. Этот набор строк в файле Makefile работает правильно для меня:

git reset --hard
git remote update --prune
git pull --rebase --all
git cherry-pick -n remotes/origin/$(BRANCH)

сохраняя мастера голого РЕПО в актуальном состоянии, мы можем выбрать предлагаемое изменение, опубликованное в голом РЕПО. У нас также есть (более сложный) способ выбрать несколько брашей для консолидированного обзора и тестирования.

Если "ничего не знает" означает "не может быть использован в качестве удаленный", то это не помогает, Но этот вопрос возник, когда я искал в интернете, чтобы придумать этот рабочий процесс, поэтому я подумал, что внесу свой вклад.

предполагая, что A Это РЕПО, которое вы хотите выбрать из вишни, и B - это тот, который вы хотите выбрать, вы можете сделать это путем добавления </path/to/repo/A/>/.git/objects до </path/to/repo/B>/.git/objects/info/alternates. Создай это alternates файлы, если он не существует.

Это позволит РЕПО B получить доступ ко всем объектам git из РЕПО A и сделает работу cherry-pick для вас.

Comments

    Ничего не найдено.