【问题标题】:Can you use tar to apply a patch to an existing web application?您可以使用 tar 将补丁应用到现有的 Web 应用程序吗?
【发布时间】:2009-03-17 23:23:58
【问题描述】:

经常为我的 CMS 系统发布补丁。我希望能够直接在我的开发系统上的完整版本上提取包含最新版本的修补文件的 tar 文件。当我提取一个 tar 文件时,它会将其放入一个带有 tar 文件名称的文件夹中。这让我不得不手动将每个文件复制到主目录。有没有办法强制 tar 将文件提取到当前目录并覆盖任何具有相同文件名的文件?任何已经存在的目录都不应被覆盖,而应合并...

这可能吗?如果是这样,命令是什么?

【问题讨论】:

    标签: linux ubuntu tar


    【解决方案1】:

    查看 tar 的 --strip-components(或 --strippath)参数,可能就是您要查找的内容。

    编辑:您可能希望将 --keep-newer 加入其中,这样任何本地修改的文件都不会被覆盖。我建议在开发服务器上测试新版本,然后使用 rsync 或 subversion 进行更改。

    【讨论】:

    • 难以置信——我一直在寻找这个功能——这个功能在我系统的 man 文件中没有记录,但它可以工作。谢谢!
    【解决方案2】:

    我尝试让 --strip-components 工作,虽然我没有那么努力,但我没有让它工作。它一直在扁平化目录结构。在搜索中,我遇到了以下命令,似乎完全符合我的要求:

    pax -r -f patch.tar -s'/patch///'

    它不是 tar,但是,嘿,它可以工作...用你的 tar 文件名替换“patch”这个词。

    【讨论】:

    • 您是否记得为 --strip-components 指定了一个级别?如果存档解压到 foo/,您将使用“--strip-components 1”。
    • 是的,我确实尝试了 --strip-components 1,但结果不是我所期望的。如果我没记错的话,它会将目录结构扁平化一层,并在此过程中弄乱文件结构。不过,正如我所说,在找到适合我的另一种方法之前,我并没有深入研究。
    【解决方案3】:

    “--strip-components”选项允许您修剪部分嵌入文件名。有了它,你就可以做你想做的事了。

    如需更多帮助,请查看http://www.gnu.org/software/tar/manual/html_section/transform.html

    【讨论】:

    • 酷。是否会以类似补丁的方式合并目录和覆盖文件?
    • 本身没有合并任何内容,但是 tar 文件中的任何内容都会覆盖当前磁盘上的内容(假设您具有适当的权限)。最好的做法是复制您的网站并进行一些试验。
    【解决方案4】:

    我刚刚做了:

    tar -xzf patch.tar.gz
    

    它会覆盖补丁包含的所有文件。

    也就是说,如果补丁是为app 文件夹的内容创建的,我会在那里解压。结果会是这样的:

    tar.gz contains: oldfolder/someoldfile.txt, oldfolder/newfolder/newfile.txt
    

    应用之前的样子:

    app/oldfolder/someoldfile.txt
    

    之后,应用看起来像

    app/oldfolder/someoldfile.txt
    oldfolder/newfolder/newfile.txt
    

    “someoldfile.txt”实际上已更新为 tar.gz 中的内容

    也许这不适用于常规 tar,只能用于 tar.gz。但我对此表示怀疑。我认为它应该适用于一切,只要用户具有写入权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      • 2023-03-09
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 2014-10-20
      相关资源
      最近更新 更多