git shell (windows) 将文件列表添加到新提交

git shell (windows) add list of files to new commit

提问前先说点背景:

所以基本上我在我的一个项目中对大量源文件中的注释进行了一些重大修改,并在文件顶部添加了关于每个文件的快速描述作为注释(以及许多注释在代码本身内)。

然后我决定完成并完成那件事,我会在描述符中添加额外的信息——比如作者、日期等。所以生活在边缘我决定使用正则表达式在文件中查找和替换select 文件的全部内容,并用 headers 中的一些额外信息替换它,保留文件中曾经存在的所有内容。当我在 Verilog 中工作时,每个文件的末尾都有一个 endmodule,所以我将其用作标记以确保我在正则表达式中得到了所有内容。

不幸的是,我忘记将 endmodule 添加回替换字符串,所以基本上在大约一百个源文件中,我丢失了最后一行。问题不大,很容易 find-replace 把它们放回去。吸取教训。


无论如何,一开始我没有意识到这一点,所以我花了一个小时左右的时间将源文件分组到我的 github 存储库的一系列提交中。幸运的是,我在将这些提交推送到原点之前注意到了 endmodule 问题,因此我能够使用 git reset --soft HEAD~4 命令删除提交以摆脱我的 3 次提交。

现在,在我这样做之前,我使用 git show 命令获取提交描述和每个提交中包含的文件列表,我现在将其保存在文本文件中。我希望使用这些来重新创建提交,将所有 endmodule 标签都放回去。

但是我 Google 的能力今晚让我很失望,因为我似乎无法找到一种方法来提交包含文件列表中的所有更改。理想情况下,我想要一些我可以在 git shell (Windows Powershell) 中 运行 的命令,它可能会读取一个包含列表的文本文件文件。然后我希望将所有这些文件添加到一个新的提交中,其中包含与以前相同的消息和扩展描述(我可以将这些文件复制并粘贴到任何命令中)。

git 是否有任何方法可以做到这一点,或者我是否需要使用 powershell 脚本来发挥创意?


我从这个 SO question 中了解到您可以使用 git commit [files] 来创建仅包含特定文件的新提交。我想我可以按照惯例添加 -m 开关来添加消息。但是如何在文件列表中通过管道替换 [files].

现在我刚刚获取了我的列表,手动将其变成一行并将其粘贴到对我有用的命令中。但是从下图可以看出,这很明显非常难看。

我确定一定有更简洁的方法来执行此操作,所以即使我的问题现在已解决,我仍然想知道是否可以在 [files] 占位符被文件的内容替换,该文件的每一行都包含一个文件名。

我不太了解powershell,但如果它有像​​xargs这样的命令行工具,我建议如下:

 xargs git commit < list_of_files

(大部分)等同于

 cat list_of_files | xargs git commit

查看 other SO question and other SO question 不幸的是,没有直接等同于 xargs。但是第一个 link 的 Foreach 函数应该提供一个大概的体验。 不幸的是我没有powershell,因此无法提供完整的解决方案。

尝试(gc .\files.txt) -Join ", "从文件中读取所有行,并return将它们作为逗号分隔列表。您可以将其嵌套为 git 提交的一部分:

edit - 根据您的建议,用双引号将每个文件路径括起来,并用 space 而不是逗号分隔(抱歉,没有想清楚) :

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

或者在加入阵列之前在阵列上使用 % { }(带脚本块的 ForEach-Object cmdlet)。

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

执行最终的 git 命令:

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