git: зафиксировать несколько файлов, но добавить сообщения - PullRequest
7 голосов
/ 02 марта 2011

У меня есть тонны файлов в моем репо, и иногда я работаю с 20 файлами, и я хочу зафиксировать все из них. Но я хотел бы добавить сообщение для каждого.

Как я могу добавить все эти файлы, которые были обновлены, а также добавить сообщение для каждого, не выполняя команду для каждого из них вручную? Можно ли выполнить массовый прогон и попросить добавить сообщение для каждого?

Ответы [ 2 ]

10 голосов
/ 02 марта 2011

(Примечание. Вы не должны думать об отдельных файлах, и при этом вы не должны фиксировать дюжину несвязанных изменений сразу. Подумайте о своих изменениях с точки зрения логических групп. Вы можете фиксировать по ходу или каждый файл можно фиксировать по одному. Но действительно постарайтесь внести одно концептуальное изменение, зафиксировать его и перейти к другому.)

Если у вас есть много измененных файлов, вы можете просто добавить их все и использовать git commit, поскольку в окне редактора содержится список измененных файлов, которые вы можете включить в свое сообщение о коммите. Но если вы хотите получить запрос для каждого из них, вы можете просмотреть их и зафиксировать их по отдельности, а затем объединить их в один коммит.

  • Запишите, где вы находитесь; мы вдавим в подробности позже:

    $ git rev-parse HEAD
    57c1df83f140b2dedbdf8a44ee623654d37bd1c3 
    
  • Перебрать измененные файлы (обратите внимание, что неотслеживаемые файлы здесь не рассматриваются) и зафиксировать каждый из них по отдельности:

    $ for file in $(git ls-files)
    >   do git add $file
    >   git commit  # Write a commit message for the file.
    >               # It might be a good idea to use a format like "filename: changes"
    > done
    
  • Сквош все:

    $ git rebase -i 57c1df83f140b2dedbdf8a44ee623654d37bd1c3
    

    Измените каждую строку, кроме первой, с pick на squash, затем сохраните и выйдите.

7 голосов
/ 02 марта 2011

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

Например:

#!/bin/sh

PROJECT_DIR=.

for FILE in ${PROJECT_DIR}/*
do
    git add ${FILE}
    git commit
done

В текущей форме скрипт считает текущий рабочий каталог PROJECT_DIR. Затем он перебирает все файлы (которые совпадают с * glob), добавляя и фиксируя их по отдельности в хранилище. Git пропускает неизмененные файлы, и для каждого измененного файла ваш редактор запускается, чтобы запросить сообщение о коммите.

Если вам будет предложено прокомментировать файл, который вы еще не хотите фиксировать, просто сохраните файл сообщения о фиксации без каких-либо изменений, и git пропустит его.

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