git shell (windows) добавить список файлов в новую фиксацию

Перед вопросом немного предыстории:

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

Затем я решил, что выполнив это и сделав это, я добавлю дополнительную информацию в дескрипторы, такие как автор, дата и т. Д. Итак, живя на грани, я решил найти и заменить в файлах, используя регулярное выражение, чтобы выбрать полное содержимое файл и замените его дополнительной информацией в заголовках, сохраняя все, что раньше было в файле. Поскольку я работаю в Verilog, в конце каждого файла стоит endmodule, поэтому я использовал его в качестве маркера, чтобы убедиться, что я получил все в регулярном выражении.

К сожалению, я забыл добавить endmodule обратно в строку замены, поэтому в основном в нескольких сотнях исходных файлов я потерял строку в конце. Это не было большой проблемой, их было легко найти-заменить, чтобы вернуть их обратно. Урок выучен.


Как бы то ни было, я сначала этого не осознавал, поэтому около часа группирую исходные файлы в серию коммитов в моем репозитории на github. К счастью, я заметил проблему endmodule перед отправкой этих коммитов в источник, поэтому я смог удалить коммиты с помощью команды git reset --soft HEAD~4, чтобы избавиться от моих 3 коммитов.

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

Но мои возможности Google подводят меня сегодня вечером, так как я не могу найти способ сделать фиксацию, содержащую все изменения из списка файлов. В идеале мне нужна какая-то команда, которую я могу запустить в оболочке git (Windows Powershell), которая, возможно, прочитает текстовый файл, содержащий список файлов. Затем я хочу, чтобы все эти файлы были добавлены в новую фиксацию с тем же сообщением и расширенным описанием, что и раньше (их я могу просто скопировать и вставить в любую команду).

Есть ли какой-либо способ сделать это, являющийся частью git, или мне нужно проявить творческий подход со сценариями PowerShell?


Из этого SO-вопроса я вижу, что вы можете использовать git commit [files] для создания новой фиксации только определенных файлов. Я предполагаю, что могу добавить переключатель -m, чтобы добавить сообщение, как обычно. Но как трубу в списке файлов заменить [files].

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

введите описание изображения здесь

Я уверен, что должен быть более аккуратный способ сделать это, поэтому, хотя моя проблема теперь исправлена, я все же хотел бы знать для справок в будущем, можно ли выполнить команду, в которой заполнитель [files] заменяется содержимым файла, который содержит имя файла в каждой строке.


person Tom Carpenter    schedule 29.04.2015    source источник
comment
git add -u добавит все файлы для фиксации, которые а) уже отслеживаются и б) были изменены с момента последней фиксации.   -  person twalberg    schedule 29.04.2015
comment
@twalberg Проблема в том, что мне нужны файлы в трех отдельных коммитах, которые я сделал. Но поскольку мне пришлось выполнить мягкий сброс, все файлы для трех коммитов отслеживаются, поэтому мне нужен способ их разделения без необходимости вручную добавлять каждый из требуемых файлов.   -  person Tom Carpenter    schedule 29.04.2015


Ответы (2)


попробуйте (gc .\files.txt) -Join ", " прочитать все строки из файла и вернуть их в виде списка, разделенного запятыми. вы можете вложить это как часть своего коммита git:

изменить - заключить каждый путь к файлу в двойные кавычки и разделить пробелом вместо запятой (извините, не совсем правильно) в соответствии с вашим предложением:

("""$((gc .\files.txt) -Join '" "')""")

в качестве альтернативы используйте % { } (командлет ForEach-Object с блоком сценария) в массиве перед присоединением к нему.

(gc .\files.txt | % {'"{0}"' -f $_}) -Join " "

чтобы сделать последнюю команду git:

git commit ("""$((gc .\files.txt) -Join '" "')""") -m "Message" -m "Extended Description"
person Vincent De Smet    schedule 30.04.2015
comment
gc - это псевдоним для Get-Content, который читает содержимое файла как массив, по умолчанию разделение выполняется на символе новой строки. см. about_join: technet.microsoft.com/en-us/library/hh847757.aspx см. также Get-Help about_join - person Vincent De Smet; 01.05.2015
comment
Вроде неплохо. Я экспериментировал с командой соединения, как вы показали. Кажется, если я сделаю это git commit (""""+$((gc ..\files.txt) -Join """ """)+"""") -m "Message" -m "Extended Description", он будет правильно загружать каждую строку из файла, заключать их все в двойные кавычки (если в именах файлов есть пробелы) и иметь пробелы между ними, а затем отправлять их в команду git commit как ожидал. Если вы добавите вышеперечисленное к своему ответу, я приму его, так как он прекрасно выполняет то, что мне нужно. - person Tom Carpenter; 01.05.2015
comment
спасибо за комментарий, я попытался сократить двойные кавычки, перемежая одинарные кавычки там, где это возможно. Также не требуется concat, поскольку вы можете помещать выражения, окруженные $( и ), в строку с двойными кавычками. Я тоже пробовал использовать $q = [char]34, но это не сделало его более читабельным - person Vincent De Smet; 01.05.2015
comment
Это действительно выглядит немного аккуратнее с меньшим количеством двойных кавычек. - person Tom Carpenter; 01.05.2015

Я не так много знаю о PowerShell, но если у него есть инструмент командной строки, такой как xargs, я бы предложил следующее:

 xargs git commit < list_of_files

что (в основном) эквивалентно

 cat list_of_files | xargs git commit

Глядя на другой вопрос SO и другой вопрос SO, к сожалению, прямого эквивалента xargs нет. Но функция Foreach из первой ссылки должна предоставить приблизительный опыт. К сожалению, у меня нет PowerShell, и поэтому я не могу предоставить полное решение.

person Nils_M    schedule 29.04.2015