Вот пример, который показывает четыре разных метода, из которых работают только третий (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);
}
conio
. _O_U16TEXT
, как описано в блоге Майкла Каплана, но, похоже, только wgets
интерпретировал (8-битные) данные из ReadFile
как UTF-16. Я проведу это немного позже в выходные. В качестве взлома вы можете попробовать изменить рецепт для сравнения коммитов в двух разных репозиториях на странице 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
git am --3way
для применения патчей Возможно, вы захотите использовать 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
GIT_ALTERNATE_OBJECT_DIRECTORIES
(что могло бы повредить мой репозиторий).
– Chuim
6 October 2015 в 09:22
Я написал небольшой скрипт для применения вывода diff для repo diff https://github.com/raghakh/android-dev-scripts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0
Вы можете сделать cherry-pick
, если добавить второе репо как удаленное к первому (а затем fetch
).
git fetch [remote-name]
во втором репо, а затем git cherry-pick [sha1]
.
– user
2 December 2014 в 21:22
fatal: unable to read tree ...
, но послеgit reset HEAD^
все работает нормально – jmarceli 20 February 2014 в 02:50<commit>
, но командаrev-parse --verify
не нравится, поскольку принимает только одно значение фиксации. Но посколькуcherry-pick
принимает значения как одиночных, так и диапазонных значений, я спрашиваю: зачем нуженrev-parse
? – Chuim 1 October 2015 в 15:37git rev-parse
требуется, если вы хотите ссылаться на фиксацию по ее имени, основанному на ref, в другом репозитории, например.master
,HEAD^^
или что-то в этом роде; rev-parse превращает его в универсальный идентификатор SHA-1. – Jakub Narębski 1 October 2015 в 19:49