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, и поэтому я не могу предоставить полное решение.