It’s not a Git error message, it’s the editor as git uses your default editor.
To solve this:
- press «i»
- write your merge message
- press «esc»
- write «:wq»
- then press enter
It’s not a Git error message, it’s the editor as git uses your default editor.
To solve this:
Решил собрать небольшой справочник по git командам, чтобы можно было просто и легко освежить у себя в памяти то что когда-то использовалось.
*Основы*
Настройка Git клиента для идентификации пользователя:
git config –global user.name “Your Name”
git config –global user.email “your@email.address”
git config –global core.editor “your editor”
Инициализация репозитория в текущем каталоге:
git init
Создает репозиторий в указанном каталоге:
git init <directory>
Клонирование репозитория на локальную машину:
git clone <repo>
Добавить файл для идексации и следить за всеми изменениями в нем ( можно задавать по маске ):
git add <file>
Добавить каталог для индексации:
git add <directory>
Удалить файл из индексации ( можно задавать по маске ):
git rm <file>
Перенести или переименовать файл / каталог:
git mv <source> <destination>
Сделать “снапшот” всех выполненных изменений:
git commit -a -m “message”
Статус репозитория ( добавление, удаление, изменение файлов ):
git status
Показать историю коммитов:
git log
Показать только определенное количество коммитов:
git log -n <limit>
Показать историю коммитов по конкретному файлу:
git log <file>
Посмотреть различия между последним коммитом и текущими изменениями:
git diff
Просмотр всех различий между коммитами:
git diff <commit> <commit>
Посмотреть различия между коммитом и текущими изменениями:
git diff <commit> <file>
Посмотреть различия между коммитами для файла:
git diff <commit> <commit> <file>
Показать список всех файлов в основной ветке:
git ls-tree master -r –name-only
*Работа с ветками*
Список веток:
git branch
Создание ветки:
git branch <new_branch_name>
Безопастное удаление ветки, если не были сделаны изменения:
git branch -d <branch_name>
Удаление ветки, даже если были сделаны изменения:
git branch -D <branch_name>
Переименование текущей ветки:
git branch -m <rename_current_branch>
Отмена изменений в локальном файле
git checkout FETCH_HEAD — — <file>
Переход к существующей ветке:
git checkout <branch_name>
Создание и переход к ветке:
git checkout -b <new_branch_name>
Слияние текущей ветки с указанной:
git merge <branch>
*Откат изменений*
Перейти на последний коммит ветки “master”:
git checkout master
Откатить изменения во всех файлах до указанного коммита:
git checkout <commit>
Откатить изменения для конкретного файла до указанного коммита:
git checkout <commit> <file>
Сделать откат всех изменений выполненных в коммите, при этом создается новый коммит указывающий на откат изменений:
git revert <commit>
Отмена изменений до последнего коммита, а также сбрасывает индексацию для конкретного файла:
git reset HEAD <file>
Отмена изменений до последнего коммита и сбрасывает индексацию:
git reset –soft
Отмена изменений до последнего коммита, сбрасывает индексацию, а так же отменить любые изменения в рабочей директории:
git reset –hard
programming Удаляет файлы которые не были добавлены в репозиторий:
git clean -f
Удаляет файлы которые не были добавлены в репозиторий по указанному пути:
git clean -f <path>
Удаляет файлы и каталоги которые не были добавлены в репозиторий:
git clean -df
Только показывает, что будет удаленно:
git clean -n
*Работа с удаленными репозиториями*
Список соединений с удаленными репозиториями:
git remote
Добавить соединение:
git remote add <name> <url>
Удалить соединение:
git remote rm <name>
Переименовать соединение:
git remote rename <old_name> <new_name>
Получить изменения из репозитория со списком всех веток ( при этом стираются любые локальные изменения ):
git fetch <remote>
Получить изменения из репозитория для конкретной ветки ( при этом стираются любые локальные изменения ):
git fetch <remote> <branch>
Получить копию текущей ветки с удаленного репозитория и слить ее с локальной копией:
git pull <remote>
Залить указанную ветку на удаленный репозиторий:
git push <remote> <branch>
И напоследок несколько ссылок где можно найти более подробное руководство по git:
Мне лично проще всего думать о KVM (Kernel-based Virtual Machine), как о таком уровне абстракции над технологиями хардверной виртуализации Intel VT-x и AMD-V. Берем машину с процессором, поддерживающим одну из этих технологий, ставим на эту машину Linux, в Linux’е устанавливаем KVM, в результате получаем возможность создавать виртуалки. Так примерно и работают облачные хостинги, например, Amazon Web Services. Наряду с KVM иногда также используется и Xen, но обсуждение этой технологии уже выходит за рамки данного поста. В отличие от технологий контейнерной виртуализации, например, того же Docker, KVM позволяет запускать в качестве гостевой системы любую ОС, но при этом имеет и большие накладные расходы на виртуализацию.
Примечание: Описанные ниже действия были проверены мной на Ubuntu Linux 14.04, но по идее будут во многом справедливы как для других версий Ubuntu, так и других дистрибутивов Linux. Все должно работать как на десктопе, так и на сервере, доступ к которому осуществляется по SSH.
Проверяем, поддерживается ли Intel VT-x или AMD-V нашим процессором:
Если что-то нагреполось, значит поддерживается, и можно действовать дальше.
Устанавливаем KVM:
Что где принято хранить:
Теперь, когда KVM установлен, создадим нашу первую виртуалку.
В качестве гостевой системы я выбрал FreeBSD. Качаем ISO-образ системы:
Управление виртуальными машинами в большинстве случаев производится при помощи утилиты virsh:
Перед запуском виртуалки нам понадобится собрать кое-какие дополнительные сведения.
Смотрим список доступных сетей:
Просмотр информации о конкретной сети (с именем default):
Смотрим список доступных оптимизаций для гостевых ОС:
Итак, теперь создаем виртуальную машину с 1 CPU, 1 Гб RAM и 32 Гб места на диске, подключенную к сети default:
Вы можете увидеть:
Это нормально, так и должно быть.
Затем смотрим свойства виртуалки в формате XML:
Тут приводится наиболее полная информация. В том числе есть, к примеру, и MAC-адрес, который понадобятся нам далее. Пока что находим информацию о VNC. В моем случае:
С помощью любимого клиента (я лично пользуюсь Rammina) заходим по VNC, при необходимости используя SSH port forwarding. Попадаем прямо в инстялятор FreeBSD. Дальше все как обычно — Next, Next, Next, получаем установленную систему.
Давайте теперь рассмотрим основные команды для работы с KVM.
Получение списка всех виртуалок:
Получение информации о конкретной виртуалке:
Запустить виртуалку:
Остановить виртуалку:
Жестко прибить виртуалку (несмотря на название, это не удаление):
Ребутнуть виртуалку:
Склонировать виртуалку:
Включить/выключить автозапуск:
Запуск virsh в диалоговом режиме (все команды в диалоговом режиме — как описано выше):
Редактирование свойств виртуалки в XML, в том числе здесь можно изменить ограничение на количество памяти и тд:
Важно! Комментарии из отредактированного XML, к сожалению, удаляются.
Когда виртуалка остановлена, диск тоже можно ресайзить:
Важно! Вашей гостевой ОС, скорее всего, не понравится, что диск внезапно стал больше или меньше. В лучшем случае, она загрузится в аварийном режиме с предложением переразбить диск. Скорее всего, вы не должны хотеть так делать. Куда проще может оказаться завести новую виртуалку и смигрировать на нее все данные.
Резервное копирование и восстановление производятся довольно просто. Достаточно сохранить куда-то вывод dumpxml, а также образ диска, а потом восстановить их. На YouTube удалось найти видео с демонстрацией этого процесса, все и вправду несложно.
Интересный вопрос — как определить, какой IP-адрес получила виртуалка после загрузки? В KVM это делается хитро. Я в итоге написал такой скрипт на Python:
#!/usr/bin/env python3
# virt-ip.py script
# (c) 2016 Aleksander Alekseev
# http://eax.me/
import sys
import re
import os
import subprocess
from xml.etree import ElementTree
def eprint(str):
print(str, file=sys.stderr)
if len(sys.argv) < 2:
eprint(«USAGE: « + sys.argv[0] + » <domain>»)
eprint(«Example: « + sys.argv[0] + » freebsd10″)
sys.exit(1)
if os.geteuid() != 0:
eprint(«ERROR: you shold be root»)
eprint(«Hint: run `sudo « + sys.argv[0] + » …`»);
sys.exit(1)
if subprocess.call(«which arping 2>&1 >/dev/null», shell = True) != 0:
eprint(«ERROR: arping not found»)
eprint(«Hint: run `sudo apt-get install arping`»)
sys.exit(1)
domain = sys.argv[1]
if not re.match(«^[a-zA-Z0-9_-]*$», domain):
eprint(«ERROR: invalid characters in domain name»)
sys.exit(1)
domout = subprocess.check_output(«virsh dumpxml «+domain+» || true»,
shell = True)
domout = domout.decode(‘utf-8’).strip()
if domout == «»:
# error message already printed by dumpxml
sys.exit(1)
doc = ElementTree.fromstring(domout)
# 1. list all network interfaces
# 2. run `arping` on every interface in parallel
# 3. grep replies
cmd = «(ifconfig | cut -d ‘ ‘ -f 1 | grep -E ‘.’ | « + \
«xargs -P0 -I IFACE arping -i IFACE -c 1 {} 2>&1 | « + \
«grep ‘bytes from’) || true»
for child in doc.iter():
if child.tag == «mac»:
macaddr = child.attrib[«address»]
macout = subprocess.check_output(cmd.format(macaddr),
shell = True)
print(macout.decode(«utf-8»))
Скрипт работает как с default сетью, так и с bridged сетью, настройку которой мы рассмотрим далее. Однако на практике куда удобнее настроить KVM так, чтобы он всегда назначал гостевым системам одни и те же IP-адреса. Для этого правим настройки сети:
… примерно таким образом:
После внесения этих правок необходимо выполнить команды:
Теперь перезагружаем несколько раз гостевую систему и убеждаемся, что она всегда получает адрес 192.168.122.184.
По умолчанию виртуальные машины могут ходить в интернет, а также к ним можно приконнектится из хост-системы. В общем и целом все выглядит так, словно гостевые системы находятся за NAT. На практике же часто бывает куда удобнее иметь bridged сеть. Как она настраивается на хост-системе ранее мы уже рассматривали в заметках Туториал по контейнеризации при помощи LXCи Контейнерная виртуализация при помощи OpenVZ.
После окончания настройки правим конфиг гостевой системы. Находим в нем что-то вроде:
… и заменяем на что-то вроде:
Перезагружаем гостевую систему и проверяем, что она получила IP по DHCP от роутера. Если же вы хотите, чтобы гостевая система имела статический IP-адрес, это настраивается как обычно внутри самой гостевой системы.
Вас также может заинтересовать программа virt-manager:
Так выглядит ее главное окно:
Как видите, virt-manager представляет собой не только GUI для виртуалок, запущенных локально. С его помощью можно управлять виртуальными машинами, работающими и на других хостах, а также смотреть на красивые графички в реальном времени. Я лично нахожу особенно удобным в virt-manager то, что не нужно искать по конфигам, на каком порту крутится VNC конкретной гостевой системы. Просто находишь виртуалку в списке, делаешь двойной клик, и получаешь доступ к монитору.
Еще при помощи virt-manager очень удобно делать вещи, которые иначе потребовали бы трудоемкого редактирования XML-файлов и в некоторых случаях выполнения дополнительных команд. Например, переименование виртуальных машин, настройку CPU affinity и подобные вещи. Кстати, использование CPU affinity существенно снижает эффект шумных соседей и влияние виртуальных машин на хост-систему. По возможности используйте его всегда.
Если вы решите использовать KVM в качестве замены VirtualBox, примите во внимание, что хардверную виртуализацию они между собой поделить не смогут. Чтобы KVM заработал у вас на десктопе, вам не только придется остановить все виртуалки в VirtualBox и Vagrant, но и перезагрузить систему. Я лично нахожу KVM намного удобнее VirtualBox, как минимум, потому что он не требует выполнять команду sudo /sbin/rcvboxdrv setup
после каждого обновления ядра, адекватно работает c Unity, и вообще позволяет спрятать все окошки.
По традиции, немного ссылок по теме:
В целом, KVM произвел на меня исключительно положительное впечатление. Теперь я не понимаю, зачем все это время я мучился с Vagrant и VirtualBox, когда все уже есть в KVM и сделано куда лучше. Ну, почти. Кое-какие косяки все же имеются. Так, например, в htop гостевой системы вы можете видеть, что утилизируете CPU на 30%, хотя на хост-системе вы утилизируете все 100%. Однако мой опыт работы с виртуальными машинами свидетельствует о том, что такого рода проблемы и прочие шумные соседи возникают всегда, и еще один минорный баг в общем-то не делает в этом плане все сильно хуже.
Информация о свободном месте на жестком диске. Параметр -h нужен чтобы выводить форматирование.
df -h
Информация о размере папки.
du /var/www
Информация об установленном диске.
hdparm -Ii /dev/sda1
Зачастую, у вас имеется группа файлов, которые вы не только не хотите автоматически добавлять в репозиторий, но и видеть в списках неотслеживаемых. К таким файлам обычно относятся автоматически генерируемые файлы (различные логи, результаты сборки программ и т.п.). В таком случае, вы можете создать файл .gitignore с перечислением шаблонов соответствующих таким файлам. Вот пример файла .gitignore:
$ cat .gitignore
*.[oa]
*~
Первая строка предписывает Git’у игнорировать любые файлы заканчивающиеся на .o или .a — объектные и архивные файлы, которые могут появиться во время сборки кода. Вторая строка предписывает игнорировать все файлы заканчивающиеся на тильду (~
), которая используется во многих текстовых редакторах, например Emacs, для обозначения временных файлов. Вы можете также включить каталоги log, tmp или pid; автоматически создаваемую документацию; и т.д. и т.п. Хорошая практика заключается в настройке файла .gitignore до того, как начать серьёзно работать, это защитит вас от случайного добавления в репозиторий файлов, которых вы там видеть не хотите.
К шаблонам в файле .gitignore применяются следующие правила:
/
) для указания каталога.!
) в качестве первого символа.Glob-шаблоны представляют собой упрощённые регулярные выражения используемые командными интерпретаторами. Символ *
соответствует 0 или более символам; последовательность [abc]
— любому символу из указанных в скобках (в данном примере a, b или c); знак вопроса (?
) соответствует одному символу; [0-9]
соответствует любому символу из интервала (в данном случае от 0 до 9).
Вот ещё один пример файла .gitignore:
# комментарий — эта строка игнорируется
# не обрабатывать файлы, имя которых заканчивается на .a
*.a
# НО отслеживать файл lib.a, несмотря на то, что мы игнорируем все .a файлы с помощью предыдущего правила
!lib.a
# игнорировать только файл TODO находящийся в корневом каталоге, не относится к файлам вида subdir/TODO
/TODO
# игнорировать все файлы в каталоге build/
build/
# игнорировать doc/notes.txt, но не doc/server/arch.txt
doc/*.txt
# игнорировать все .txt файлы в каталоге doc/
doc/**/*.txt
Шаблон **/
доступен в Git, начиная с версии 1.8.2.
Скачиваем утилитку https://git-for-windows.github.io/ для работы из под Windows.
Добавление удаленного репозитория
git remote add origin https://github.com/tutorialzine/awesome-project.git # пример использования # git push origin master
Добавление файла
git add feature.txt git commit -m "New feature complete." # -m это параметр для указания сообщения
Создание новой ветки
git branch amazing_new_feature
Просмотр веток
git branch
Переключение на ветку
git checkout amazing_new_feature
Авторизация от имени администратора:
sudo -s
Информация о дисках
fdisk -l
Проверка диска
sudo shutdown now - переход в single режим umount / - размонтирование диска (fdisk -l) fsck -y -f -c /dev/sda1
Проверка на битые секторы
badblocks -v /dev/XYZ > file.list - проверка e2fsck -l file.list /dev/XYZ - лечим если наши ошибки
sudo touch /forcefsck - для проверки при загруке
Запуск выполнения команд через terminal:
mysql -u root -p
Создание индекса:
alter table [table_name] add index ([column_name]) constraint ([fk_id]) foreign key ([key_name]) references [ref_table](ref_table_key_id)
Добавление колонки:
alter table [table_name] add [column_name] bit default 0 after [column_name]
Вызов процедуры:
CALL [proc_name] ();
Просмотр колонок у таблицы:
describe table_name;
Просмотреть код у таблицы:
show create table table_name;
sudo apt-get install postgresql
Дальше настраиваем безопасность:
1. переходим в папку /etc/postgresql/{version}/main
2. открываем папку postgresql.conf
listen_addresses = ‘*’
3. открываем файл pg_hba.conf
Находим строку
host all all 127.0.0.1/32 md5
и меняем её на
host all all 0.0.0.0/0 md5
Дополнение для windows
Скачиваем приложение managment tools и создаем подключение к БД
Статьи:
Руководство по postgresql — http://help.ubuntu.ru/wiki/%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D0%BE_ubuntu_server/%D0%B1%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/postgresql
Права доступа — http://dba.stackexchange.com/questions/83984/connect-to-postgresql-server-fatal-no-pg-hba-conf-entry-for-host
Managment Tools — https://www.postgresql.org/ftp/pgadmin3/pgadmin4/v1.2/windows/