git shell (windows) добавляет список файлов для нового коммита

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

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

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

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


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

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

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

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


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

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

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

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

2 ответа

Решение

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

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

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

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

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

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

git commit ("""$((gc .\files.txt) -Join '" "')""") -m "Message" -m "Extended Description"

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

 xargs git commit < list_of_files

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

 cat list_of_files | xargs git commit

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

Другие вопросы по тегам