Понимание Git команд - PullRequest
       8

Понимание Git команд

0 голосов
/ 27 января 2020

Я пытаюсь понять некоторые git команды, которые я видел. sh file

git ls-files . --exclude-standard --others -m | wc -l

Насколько я понимаю, это должно перечислить все git файлы для фиксации ? из git документы , исключить стандартные средства

--exclude-standard

    Add the standard Git exclusions: .git/info/exclude, .gitignore in each directory, and the user’s global exclusion file.

Что я не уверен, что это делает? как добавить .gitignore в каждый каталог? также что означает --others -m | wc -l в приведенном выше фрагменте?

также, что это значит?

git ls-files . --exclude-standard --others -m | xargs
git stash push -k -u -- $files_to_stash >/dev/null 2>/dev/null
git checkout --theirs . >/dev/null 2>/dev/null
git stash drop >/dev/null 2>/dev/null

Было бы очень полезно, если бы кто-то мог объяснить мне вышеуказанные команды и их назначение / использовать?

1 Ответ

1 голос
/ 27 января 2020

За всем этим стоит лот (много всего).

Как axia c отмечено в комментарии , | символ является частью оболочки программирования . Стандартные оболочки Unix / Linux или интерпретаторы командной строки читают и выполняют команды либо из интерактивного сеанса, либо из сценария. Точные детали варьируются от одной оболочки к другой, но все они поддерживают концепцию трубопровода . Конвейер соединяет одну команду с другой командой, и команды Unix / Linux имеют понятия стандартный ввод и стандартный вывод . Итак:

prog1 | prog2 | prog3

запускает три программы: prog1 читает свой стандартный ввод с клавиатуры или там, где прямо сейчас установлен стандартный ввод оболочки. Вывод prog1 направляется в prog2, поэтому, когда prog2 читает свой стандартный ввод, он видит все, что напечатано prog2. Между тем вывод prog2 направляется в prog3, поэтому, когда prog3 читает свой стандартный ввод, он видит то, что напечатал prog2. Так как стандартный вывод prog3 не перенаправлен, он идет туда, где прямо сейчас установлен стандартный ввод оболочки: вероятно, ваше окно терминала.

Команда wc считает символ, слова и строки. Аргумент -l для wc говорит ему о том, что он должен подавлять количество символов и слов и печатать только количество строк.

Команда git ls-files несколько сложна. Он может:

  • перечислять файлы, которые находятся в Git index (это значение по умолчанию), или
  • перечислять файлы, которые aren 't в индексе Git (это то, что --others выбирает).

Когда он делает эти списки, он может включать или исключать файлы на основе различных критериев. В этом конкретном случае флаг --others указывает списку файлов, которые имеют в рабочем дереве и не в индексе. Флаг -m в этом конкретном режиме не имеет значения и игнорируется. Аргумент --exclude-standard делает именно то, что вы процитировали: исключите из вывода списка имена файлов, которые были бы напечатаны, но которые соответствуют стандартным критериям исключения.

Стандартные критерии исключения несколько сложны, как и понятия index и work-tree в первую очередь. Однако, чтобы значительно упростить индекс - в некоторых интересных случаях он может быть неверным - индекс Git равен , где вы строите следующий коммит, который вы сделаете . Следовательно, git ls-files --others перечисляет файлы, которые Git не будет фиксировать: он перечисляет файлы, которые не в индексе, и Git собирается фиксировать файлы, которые являются в индексе.

git ls-files, который вы цитировали, добавляет . к концу, что потенциально меняет каталоги, которые рассматриваются для печати. Тем не менее, git ls-files по умолчанию работает с ., так что в этом случае . бесполезен, хотя и безвреден.

Имейте в виду, что git stash, о котором мы поговорим далее, обычно работает на всем рабочем дереве, даже если вы находитесь в каком-либо подкаталоге в рабочем дереве. Команда git ls-files работает по-другому: она запускается на любом уровне, а не сверху.

Команда git stash push довольно сложна, особенно при использовании с аргументами. В частности:

git stash push -k -u -- $files_to_stash

пишет три Git коммитов вместо обычных двух. Обычный git stash будет тогда запускать эквивалент git reset --hard, но один с -k делает что-то другое: он проверяет индексные копии файлов. При -u третий коммит содержит несколько неотслеживаемых файлов. Эти опции могут использоваться независимо (хотя здесь их нет).

Не отслеживаемые файлы - это те, которые находятся в рабочем дереве, но не в индексе, о чем мы говорили Примерно мгновение go с git ls-files --others. Однако Git различает неотслеживаемые файлы, которые не игнорируются - в частности, команда git status будет жаловаться на такие файлы - и неотслеживаемые файлы, которые являются игнорируется, где git status подавляет жалобу. К типу неотслеживаемых файлов, которые хранит -u, относятся те, чьи жалобы не должны подавляться, поэтому эта операция git stash -u применяется к тем же файлам, которые мы можем увидеть в git ls-files --others --exclude-standard.

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

При добавлении указанных c путей к git stash его операции ограничиваются этими конкретными путями, кроме что фиксации индекса и рабочего дерева все еще содержат все файлы. На самом деле вопрос скорее в том, какая версия из каких файлов go в индекс и в коммиты рабочего дерева, которые были сделаны, и впоследствии сбрасывается на совпадение HEAD (нормальная работа) или индекса (* 1128) * mode).

Первое перенаправление в конце, >/dev/null, является конструктом оболочки - оно не является частью самого Git. Он говорит оболочке отправить стандартный вывод команды в файл /dev/null. Этот файл сам по себе особенный: данные, записанные в файл, немедленно удаляются, а файл остается нулевой длины. (Вы также можете читать данные из /dev/null: кажется, что при чтении они содержат бесконечное число нулевых байтов, даже если его длина равна нулю.)

Команда git checkout чрезвычайно сложна - настолько что начиная с Git 2.23, оно было разделено на две отдельные команды, git switch и git restore. Существующая команда git checkout по-прежнему работает как обычно. Просто объясняет и управляет различными операциями здесь, когда они разделены на две команды. (Это также дает git restore возможность делать то, что раньше было невозможно, с помощью одной команды Git.) Конкретная, о которой вы спрашивали, используя --theirs, вызывает режим извлечения, который полезен только тогда, когда индекс хранит конфликт слияния . В этом режиме индекс не предлагаемый следующий коммит: он был расширен, и фиксация запрещена до разрешения конфликтов слияния. Это слишком большая топика c, чтобы указывать здесь.

Последняя команда, git stash drop, направляет Git на сброс a sta sh (тайники являются двумя или -три кластеров фиксации, сделанных git stash push или его старшим синонимом, git stash save). Эта команда немного опасна тем, что после сброса sta sh может быть очень трудно найти. Все Git 'обычные' упс, я не хотел забывать, что трюки восстановления после всех 'хитрости восстановления с напрасным sta sh напрасны, так что будьте уверены, что все оставленные * * sh * * действительно больше не нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...