【问题标题】:git shell (windows) add list of files to new commitgit shell(windows)将文件列表添加到新提交
【发布时间】:2015-07-08 03:32:24
【问题描述】:

在问题之前,有一点背景故事:

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

然后我决定完成并完成此操作,我将在描述符中添加其他信息 - 例如作者、日期等。因此,我决定使用正则表达式在文件中查找和替换以选择文件的完整内容并将其替换为标题中的一些额外信息,以保留文件中曾经存在的所有内容。当我在 Verilog 中工作时,每个文件的末尾都有一个 endmodule,所以我用它作为标记来确保我得到了正则表达式中的所有内容。

不幸的是,我忘记将endmodule 添加回替换字符串,所以基本上在大约数百个源文件中,我丢失了最后一行。不是太大的问题,很容易找到并替换它们。经验教训。


无论如何,我一开始并没有意识到这一点,所以我花了一个小时左右的时间将源文件分组到我的 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] 占位符所在的命令以供将来参考替换为每行包含一个文件名的文件的内容。

【问题讨论】:

  • git add -u 将添加所有提交的文件,这些文件是 a) 已被跟踪且 b) 自上次提交以来已被修改
  • @twalberg 问题是我想要文件在我所做的三个单独的提交中。但是因为我必须进行软重置,所以三个提交的所有文件都被跟踪,所以我需要一种分离它们的方法,而不必手动添加每个所需的文件。

标签: git powershell github-for-windows


【解决方案1】:

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

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

("""$((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"

【讨论】:

  • gcGet-Content 的别名,它将文件的内容作为数组读取,默认拆分是换行符。见about_join: technet.microsoft.com/en-us/library/hh847757.aspx 另见Get-Help about_join
  • 这似乎相当不错。正如您所展示的,我一直在尝试使用 join 命令。似乎如果我这样做git commit (""""+$((gc ..\files.txt) -Join """ """)+"""") -m "Message" -m "Extended Description" 它将正确加载文件中的每一行,用双引号将它们全部括起来(以防文件名中有空格),并在它们之间有空格,然后将它们发送到 git commit命令按预期。如果您将上述内容添加到您的答案中,我会接受它,因为它很好地满足了我的需求。
  • 感谢您的评论,我尽量减少穿插单引号的双引号。也不需要 concat,因为您可以将用 $() 包围的表达式放在双引号字符串中。我也尝试使用$q = [char]34,但它并没有使它更具可读性
  • 双引号越少,确实看起来更整洁了。
【解决方案2】:

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

 xargs git commit < list_of_files

这(大部分)等同于

 cat list_of_files | xargs git commit

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

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 2015-05-06
    • 1970-01-01
    • 2016-10-16
    • 2018-06-16
    • 1970-01-01
    • 2023-02-09
    • 2020-07-18
    相关资源
    最近更新 更多