Можно ли зафиксировать изменения в репозитории GitHub пользователя в репозитории другого пользователя? [Дубликат]

Вот пример, который показывает четыре разных метода, из которых работают только третий (C conio) и четвертый (собственный Windows API) (но только если stdin / stdout не перенаправлены). Обратите внимание, что вам по-прежнему нужен шрифт, содержащий символ, который вы хотите показать (Lucida Console поддерживает по крайней мере греческий и кириллический). Обратите внимание, что все здесь совершенно не переносимо, просто нет портативного способа ввода / вывода строк Unicode на терминале.

#ifndef UNICODE
#define UNICODE
#endif

#ifndef _UNICODE
#define _UNICODE
#endif

#define STRICT
#define NOMINMAX
#define WIN32_LEAN_AND_MEAN

#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>

#include <conio.h>
#include <windows.h>

void testIostream();
void testStdio();
void testConio();
void testWindows();

int wmain() {
    testIostream();
    testStdio();
    testConio();
    testWindows();
    std::system("pause");
}

void testIostream() {
    std::wstring first, second;
    std::getline(std::wcin, first);
    if (!std::wcin.good()) return;
    std::getline(std::wcin, second);
    if (!std::wcin.good()) return;
    std::wcout << first << second << std::endl;
}

void testStdio() {
    wchar_t buffer[0x1000];
    if (!_getws_s(buffer)) return;
    const std::wstring first = buffer;
    if (!_getws_s(buffer)) return;
    const std::wstring second = buffer;
    const std::wstring result = first + second;
    _putws(result.c_str());
}

void testConio() {
    wchar_t buffer[0x1000];
    std::size_t numRead = 0;
    if (_cgetws_s(buffer, &numRead)) return;
    const std::wstring first(buffer, numRead);
    if (_cgetws_s(buffer, &numRead)) return;
    const std::wstring second(buffer, numRead);
    const std::wstring result = first + second + L'\n';
    _cputws(result.c_str());
}

void testWindows() {
    const HANDLE stdIn = GetStdHandle(STD_INPUT_HANDLE);
    WCHAR buffer[0x1000];
    DWORD numRead = 0;
    if (!ReadConsoleW(stdIn, buffer, sizeof buffer, &numRead, NULL)) return;
    const std::wstring first(buffer, numRead - 2);
    if (!ReadConsoleW(stdIn, buffer, sizeof buffer, &numRead, NULL)) return;
    const std::wstring second(buffer, numRead);
    const std::wstring result = first + second;
    const HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD numWritten = 0;
    WriteConsoleW(stdOut, result.c_str(), result.size(), &numWritten, NULL);
}
  • Редактировать 1: Я добавил метод, основанный на conio.
  • Редактирование 2: Я немного испортил _O_U16TEXT, как описано в блоге Майкла Каплана, но, похоже, только wgets интерпретировал (8-битные) данные из ReadFile как UTF-16. Я проведу это немного позже в выходные.
85
задан takeshin 28 September 2010 в 20:18
поделиться

4 ответа

В качестве взлома вы можете попробовать изменить рецепт для сравнения коммитов в двух разных репозиториях на странице GitTips , то есть:

GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects \
git cherry-pick $(git --git-dir=../repo/.git rev-parse --verify <commit>)

, где ../repo - путь к другой репозиторий.

С помощью современных Git вы можете использовать несколько версий и диапазонов ревизий с помощью cherry-pick .

Здесь $(git --git-dir=../repo/.git rev-parse --verify <commit>) используется для перевода <commit> (для пример HEAD или v0.2 или master~2, которые являются значениями во втором репозитарии, который вы копируете) в идентификатор SHA-1 фиксации. Если вы знаете SHA-1 изменения, которое вы хотите выбрать, это необязательно.

ЗАМЕЧАНИЕ, однако, что Git может пропускать копирование объектов из исходного репозитория, так как он не знает, что репозиторий альтернативных объектов только временный, для одной операции. Возможно, вам придется копировать объекты из второго репозитория с помощью:

GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects git repack -a -d -f

. Это ставит те объекты, которые были заимствованы из второго хранилища в хранилище оригинального хранилища

Не проверено.


Не так хакерское решение состоит в том, чтобы следовать knittl answer :

  • Перейти ко второму репозиторию, который вы хотите скопировать, и генерировать исправления от коммитов, которые вы хотите с помощью git format-patch
  • . При необходимости скопировать исправления (0001- * и т. д.) в ваш репозиторий
  • Используйте git am --3way для применения патчей
27
ответ дан Community 21 August 2018 в 21:01
поделиться
  • 1
    Работает хорошо. Если у вас возникли проблемы с фиксацией, выполните команду git reset HEAD; git add. '. – gumik 16 October 2012 в 10:53
  • 2
    это потрясающе - как бы вы сделали целый ряд коммитов? просто sha1 ... sha2? – hvgotcodes 6 March 2013 в 19:09
  • 3
    Я также получаю fatal: unable to read tree ..., но после git reset HEAD^ все работает нормально – jmarceli 20 February 2014 в 02:50
  • 4
    @hvgotcodes он работал для меня просто, передавая диапазон как <commit>, но команда rev-parse --verify не нравится, поскольку принимает только одно значение фиксации. Но поскольку cherry-pick принимает значения как одиночных, так и диапазонных значений, я спрашиваю: зачем нужен rev-parse? – Chuim 1 October 2015 в 15:37
  • 5
    @Chuim: git rev-parse требуется, если вы хотите ссылаться на фиксацию по ее имени, основанному на ref, в другом репозитории, например. master, HEAD^^ или что-то в этом роде; rev-parse превращает его в универсальный идентификатор SHA-1. – Jakub Narębski 1 October 2015 в 19:49

Возможно, вы захотите использовать git format-patch , а затем git am , чтобы применить этот патч к вашему репозиторию.

/path/to/1 $ git format-patch sha1^..sha1
/path/to/1 $ cd /path/to/2
/path/to/2 $ git am -3 /path/to/1/0001-…-….patch

Или, в одной строке:

/path/to/2 $ git --git-dir=/path/to/1/.git format-patch --stdout sha1^..sha1 | git am -3
161
ответ дан Ohad Schneider 21 August 2018 в 21:01
поделиться
  • 1
    Тот же ответ здесь: stackoverflow.com/a/9507417/1959808 – Ioannis Filippidis 18 June 2015 в 19:37
  • 2
    Это решение оказалось более простым и безопасным, чем принятый ответ прямого набора вишней с использованием GIT_ALTERNATE_OBJECT_DIRECTORIES (что могло бы повредить мой репозиторий). – Chuim 6 October 2015 в 09:22
  • 3
    Когда есть конфликты, это не сработает, потому что не удается найти коммиты на другой ветке. – YesMan85 22 August 2017 в 20:03

Я написал небольшой скрипт для применения вывода diff для repo diff https://github.com/raghakh/android-dev-scripts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0

5
ответ дан Ragha 21 August 2018 в 21:01
поделиться

Вы можете сделать cherry-pick, если добавить второе репо как удаленное к первому (а затем fetch).

70
ответ дан wRAR 21 August 2018 в 21:01
поделиться
  • 1
    На самом деле это правильный способ сделать это. – Wilbert 28 March 2013 в 11:39
  • 2
    Это похоже на правильный путь для меня. И я просто использовал его, и это сработало для меня. – socketwiz 21 March 2014 в 18:42
  • 3
    Я бы сказал: do git fetch [remote-name] во втором репо, а затем git cherry-pick [sha1]. – user 2 December 2014 в 21:22
  • 4
    Спасибо, спасибо. Поскольку второе репо было также локально, просто нужно было использовать URI файла при добавлении его в качестве удаленного. – palimpsestor 5 March 2015 в 07:13
  • 5
    Похоже, что это действительно лучший ответ – shrimpwagon 24 July 2015 в 15:17
Другие вопросы по тегам:

Похожие вопросы: