<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Oxysc</title>
  
  
  <link href="https://blog.oxysc.cc/atom.xml" rel="self"/>
  
  <link href="https://blog.oxysc.cc/"/>
  <updated>2025-03-08T17:03:30.271Z</updated>
  <id>https://blog.oxysc.cc/</id>
  
  <author>
    <name>Oxysc</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>[自用留档][免费分享]微星Z370GamingProCarbonAC黑苹果EFI</title>
    <link href="https://blog.oxysc.cc/Z370OC104/"/>
    <id>https://blog.oxysc.cc/Z370OC104/</id>
    <published>2025-03-08T08:23:50.000Z</published>
    <updated>2025-03-08T17:03:30.271Z</updated>
    
    <content type="html"><![CDATA[<h2 id="EFI详情"><a href="#EFI详情" class="headerlink" title="EFI详情"></a>EFI详情</h2><p>OpenCore版本1.0.4</p><p>实测兼容MacOS Sonoma 14.7</p><p>USB已定制，使用USBPort.kext</p><p>已设置核显加速</p><p>蓝牙WIFI可用，隔空投送未经测试，应该无效</p><p>因为我自己使用OC进行多系统启动，因此此配置在启动其它系统时并不会覆盖主板等信息为MAC设备</p><p>请自行更新机型配置</p><p>注：由于制作时部分Kext并未表明支持了MacOS15，因此本人仅安装了14.7使用，在更新OpenCore后保存留档，如果需要，请自行更新Kext再尝试MacOS15</p><p>注2：清除了我自用的一些配置，未经测试，不过应该没有问题，只是把我自己的自定义启动项删了而已</p><p>机器配置：</p><p>CPU：i9-9900k</p><p>主板：微星Z370 Gaming Pro Carbon AC （MS-7B45）</p><p>内存：影驰星耀DDR4 8G 3200Mhz*2</p><p>GPU：Intel UHD Graphics 630 (配置为加速GPU)</p><p>​    AMD Radeon RX5700 （迪兰恒进战神）</p><p>无线网卡：Intel AC8265</p><h2 id="下载链接"><a href="#下载链接" class="headerlink" title="下载链接"></a>下载链接</h2><p><a class="link" href="https://pan.oxysc.cc/s/D8TM">作者个人网盘(BuyVM拉斯维加斯)<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p>密码：y2rhgf</p><p><a class="link" href="https://cloud.189.cn/t/rQJ3ambIJfim">天翼云盘<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p>访问码：vh8a</p><p><a class="link" href="https://caiyun.139.com/m/i?2jQXo8nSpavef">移动云盘<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p>提取码：mgqb</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;EFI详情&quot;&gt;&lt;a href=&quot;#EFI详情&quot; class=&quot;headerlink&quot; title=&quot;EFI详情&quot;&gt;&lt;/a&gt;EFI详情&lt;/h2&gt;&lt;p&gt;OpenCore版本1.0.4&lt;/p&gt;
&lt;p&gt;实测兼容MacOS Sonoma 14.7&lt;/p&gt;
&lt;p&gt;USB已定制</summary>
      
    
    
    
    <category term="资源分享" scheme="https://blog.oxysc.cc/categories/%E8%B5%84%E6%BA%90%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="资源分享" scheme="https://blog.oxysc.cc/tags/%E8%B5%84%E6%BA%90%E5%88%86%E4%BA%AB/"/>
    
    <category term="黑苹果" scheme="https://blog.oxysc.cc/tags/%E9%BB%91%E8%8B%B9%E6%9E%9C/"/>
    
  </entry>
  
  <entry>
    <title>在windows使用rclone挂载webdav为本地盘并设置开机启动</title>
    <link href="https://blog.oxysc.cc/RcloneMount/"/>
    <id>https://blog.oxysc.cc/RcloneMount/</id>
    <published>2025-03-01T11:33:11.000Z</published>
    <updated>2025-03-08T17:03:30.275Z</updated>
    
    <content type="html"><![CDATA[<h2 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h2><h3 id="所需软件"><a href="#所需软件" class="headerlink" title="所需软件"></a>所需软件</h3><ul><li><p><a class="link" href="https://winfsp.dev/rel/">WinFSP<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>：Rclone在windows平台挂载网络磁盘到本地所<strong>必需</strong>的依赖。</p></li><li><p><a class="link" href="https://nssm.cc/download">NSSM<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>：用于将Rclone包装为windows服务，实现开机自启 。</p></li><li><p><a class="link" href="https://rclone.org/downloads/">Rclone<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>：用于挂载网络磁盘。</p></li></ul><h3 id="配置环境"><a href="#配置环境" class="headerlink" title="配置环境"></a>配置环境</h3><p>Rclone在windows端的挂载功能需要WinFSP作为依赖，首先从所需软件部分的超链接下载所需软件的最新版本，以默认设置安装WinFSP，将NSSM和Rclone解压到任意英文文件夹，并记住它们的位置，接下来要将它们添加到环境变量中。</p><p>你可以在控制面板中搜索”查看高级系统设置”打开”系统属性”窗口，或者直接在windows任务栏上的搜索框搜索”环境变量”，打开第一个带着名称下方带有”控制面板”的选项同样可以打开”系统属性”窗口</p><p>像是这样:<img lazyload src="/images/loading.svg" data-src="/RcloneMount/image-20250301212013860.png" class title="image-20250301212013860"></p><p>随后，点击”环境变量”按钮打开”环境变量”窗口，你可以在上方”xxx的用户变量”或者下方”系统变量”中找到名为”Path”的变量，一般不建议添加到系统变量，所以双击用户变量的”Path”变量打开”编辑环境变量”窗口，在右侧点击”新建”按钮，在左侧最下面出现的空白输入框中输入”&lt;NSSM根目录&gt;\win64”，输入完成后回车并再次点击右侧”新建”按钮，在输入框中输入”&lt;rclone根目录&gt;”回车并点击窗口下方的确定，直到关闭”系统属性”窗口。</p><blockquote><p>NSSM的根目录是指README.txt所在的位置，Rclone则是rclone.exe所在位置，你可以在文件管理器上方的地址栏复制路径。</p></blockquote><img lazyload src="/images/loading.svg" data-src="/RcloneMount/image-20250301213638320.png" class title="image-20250301213638320"><img lazyload src="/images/loading.svg" data-src="/RcloneMount/image-20250301213702851.png" class title="image-20250301213702851"><img lazyload src="/images/loading.svg" data-src="/RcloneMount/image-20250301214106374.png" class title="image-20250301214106374"><p>如此便完成了准备工作。</p><h2 id="设置并挂载网盘"><a href="#设置并挂载网盘" class="headerlink" title="设置并挂载网盘"></a>设置并挂载网盘</h2><h3 id="设置rclone"><a href="#设置rclone" class="headerlink" title="设置rclone"></a>设置rclone</h3><p>因为前面添加了环境变量，因此我们可以直接打开终端进行Rclone的配置，接下来的所有操作都以成功添加了环境变量为前提，如果你没有添加，请到Rclone所在目录执行（在地址栏输入cmd可以直接打开终端），并把”rclone”替换为”.\rclone.exe”</p><p>按”WIN”键+”R”键打开”运行”窗口，输入”cmd”或者”powershell”打开终端。</p><img lazyload src="/images/loading.svg" data-src="/RcloneMount/image-20250301224805600.png" class title="image-20250301224805600"><p>输入”rclone config”开始配置rclone</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">&gt; </span><span class="language-bash">rclone config</span></span><br><span class="line"></span><br><span class="line">Current remotes:</span><br><span class="line"></span><br><span class="line">Name                 Type</span><br><span class="line">====                 ====</span><br><span class="line"></span><br><span class="line">e) Edit existing remote</span><br><span class="line">n) New remote//新建远程配置</span><br><span class="line">d) Delete remote//删除远程配置</span><br><span class="line">r) Rename remote//重命名远程配置</span><br><span class="line">c) Copy remote//复制远程配置</span><br><span class="line">s) Set configuration password</span><br><span class="line">q) Quit config//退出设置</span><br><span class="line"><span class="meta prompt_">e/n/d/r/c/s/q&gt;</span></span><br></pre></td></tr></table></figure></div><p>因为我们还未进行任何配置，所以输入”n”来新建一个配置，随后输入名称，这里设置的名称也会显示为挂载后硬盘的默认名称。</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">e/n/d/r/c/s/q&gt; </span><span class="language-bash">n</span></span><br><span class="line"></span><br><span class="line">Enter name for new remote.//输入新远程的名称</span><br><span class="line"><span class="meta prompt_">name&gt; </span><span class="language-bash">&lt;名称&gt;</span></span><br></pre></td></tr></table></figure></div><p>接下来选择远程的类型，我的这个版本中，webdav的序号为56，所以这里输入56。</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">name&gt; </span><span class="language-bash">&lt;名称&gt;</span></span><br><span class="line"></span><br><span class="line">Option Storage.//选择存储</span><br><span class="line">Type of storage to configure.//设置存储的类别</span><br><span class="line">Choose a number from below, or type in your own value.//输入一个数字或者键入一个值</span><br><span class="line"> 1 / 1Fichier</span><br><span class="line">   \ (fichier)</span><br><span class="line">...</span><br><span class="line">56 / WebDAV</span><br><span class="line">   \ (webdav)</span><br><span class="line">...</span><br><span class="line"><span class="meta prompt_">Storage&gt; </span><span class="language-bash">56</span></span><br></pre></td></tr></table></figure></div><p>接下来输入你的webdav连接地址，然后根据你的webdav网站所使用的程序，如果没有则使用other选项</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">url&gt; </span><span class="language-bash">&lt;网站地址&gt;</span></span><br><span class="line"></span><br><span class="line">Option vendor.</span><br><span class="line">Name of the WebDAV site/service/software you are using.</span><br><span class="line">Choose a number from below, or type in your own value.</span><br><span class="line">Press Enter to leave empty.</span><br><span class="line"> 1 / Fastmail Files</span><br><span class="line">   \ (fastmail)</span><br><span class="line"> 2 / Nextcloud</span><br><span class="line">   \ (nextcloud)</span><br><span class="line"> 3 / Owncloud</span><br><span class="line">   \ (owncloud)</span><br><span class="line"> 4 / Sharepoint Online, authenticated by Microsoft account</span><br><span class="line">   \ (sharepoint)</span><br><span class="line"> 5 / Sharepoint with NTLM authentication, usually self-hosted or on-premises</span><br><span class="line">   \ (sharepoint-ntlm)</span><br><span class="line"> 6 / rclone WebDAV server to serve a remote over HTTP via the WebDAV protocol</span><br><span class="line">   \ (rclone)</span><br><span class="line"> 7 / Other site/service or software</span><br><span class="line">   \ (other)</span><br><span class="line"><span class="meta prompt_">vendor&gt; </span><span class="language-bash">7//按照webdav网站程序设置</span></span><br></pre></td></tr></table></figure></div><p>接下来输入用户名，如果webdav连接有密码则选择”y”并输入连接密码，没有则选择”n”这样会将密码留空。注意：这里输入的密码不会显示出来</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">Option user.//设置用户</span><br><span class="line">User name.</span><br><span class="line">In case NTLM authentication is used, the username should be in the format &#x27;Domain\User&#x27;.</span><br><span class="line">Enter a value. Press Enter to leave empty.//输入一个值，如果按下回车则会留空</span><br><span class="line"><span class="meta prompt_">user&gt; </span><span class="language-bash">&lt;用户名&gt;</span></span><br><span class="line"></span><br><span class="line">Option pass.//设置鉴权</span><br><span class="line">Password.//密码</span><br><span class="line">Choose an alternative below. Press Enter for the default (n).</span><br><span class="line">y) Yes, type in my own password//是的，输入我自己的密码</span><br><span class="line">g) Generate random password//设置一个随机密码</span><br><span class="line">n) No, leave this optional password blank (default)//否，将密码留空</span><br><span class="line"><span class="meta prompt_">y/g/n&gt; </span><span class="language-bash">y</span></span><br><span class="line">Enter the password://输入密码</span><br><span class="line">password:</span><br><span class="line">Confirm the password://确认密码</span><br><span class="line">password:</span><br></pre></td></tr></table></figure></div><p>接下来程序会要求我们设置一个叫”bearer_token”的东西，是用来代替密码的口令，我们后续的操作不需要重复输入密码，因此可以直接将这个可选项留空，不会有任何影响。随后会询问我们是否要修改高级设置，我们不需要，直接回车或者输入”n”跳过。</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Option bearer_token.</span><br><span class="line">Bearer token instead of user/pass (e.g. a Macaroon).</span><br><span class="line">Enter a value. Press Enter to leave empty.</span><br><span class="line"><span class="meta prompt_">bearer_token&gt; </span><span class="language-bash">直接回车设置为空值，对于我们只进行挂载无影响</span></span><br><span class="line"></span><br><span class="line">Edit advanced config?</span><br><span class="line">y) Yes</span><br><span class="line">n) No (default)</span><br><span class="line"><span class="meta prompt_">y/n&gt; </span><span class="language-bash">n</span></span><br></pre></td></tr></table></figure></div><p>配置完成后，程序会显示你的配置供你确认，如果确认无误便回车接受，随后按q退出程序，如果发现有输入错误就输入”e”返回重新设置。</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">Configuration complete.</span><br><span class="line">Options:</span><br><span class="line">- type: webdav</span><br><span class="line">- url: https://xxx.xxxx.xx/xxx</span><br><span class="line">- vendor: other</span><br><span class="line">- user: xxxxxxx</span><br><span class="line">- pass: *** ENCRYPTED ***</span><br><span class="line">Keep this &quot;xxxx&quot; remote?</span><br><span class="line">y) Yes this is OK (default)</span><br><span class="line">e) Edit this remote</span><br><span class="line">d) Delete this remote</span><br><span class="line"><span class="meta prompt_">y/e/d&gt; </span><span class="language-bash">y</span></span><br><span class="line"></span><br><span class="line">Current remotes:</span><br><span class="line"></span><br><span class="line">Name                 Type</span><br><span class="line">====                 ====</span><br><span class="line">xxxxxxxx      webdav</span><br><span class="line"></span><br><span class="line">e) Edit existing remote</span><br><span class="line">n) New remote</span><br><span class="line">d) Delete remote</span><br><span class="line">r) Rename remote</span><br><span class="line">c) Copy remote</span><br><span class="line">s) Set configuration password</span><br><span class="line">q) Quit config</span><br><span class="line"><span class="meta prompt_">e/n/d/r/c/s/q&gt; </span><span class="language-bash">q</span></span><br></pre></td></tr></table></figure></div><p>*<em>此代码块仅作输出示例，以你自己的配置为准</em></p><h3 id="挂载网盘"><a href="#挂载网盘" class="headerlink" title="挂载网盘"></a>挂载网盘</h3><p>使用命令挂载来测试配置</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rclone mount &lt;此前设置的配置名称&gt;:&lt;远程路径&gt; &lt;本地挂载点&gt; [参数]</span><br></pre></td></tr></table></figure></div><p>建议使用：</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rclone mount &lt;此前设置的配置名称&gt;:/ Z: --cache-dir &lt;绝对路径&gt; --vfs-cache-mode writes --buffer-size 128M --vfs-read-ahead 1G --vfs-read-chunk-size 64M --vfs-cache-max-age 1h --vfs-cache-max-size 10G --transfers 5 --checkers 16</span><br></pre></td></tr></table></figure></div><p>“Z:”代表要挂载到的路径为”Z:”即作为Z盘挂载到本机。</p><p>“–cache-dir &lt;绝对路径&gt;”&lt;绝对路径&gt;是文件缓存位置。</p><p>“–buffer-size 128M”设置内存缓冲区大小为128M。</p><p>“–vfs-read-ahead 1G”表示预先读取最大1G的数据，对于视频播放更友好。</p><p>“–vfs-read-chunk-size 64M”为数据块大小，远程读取文件时按照每64M为一个块分段下载文件。</p><p>“–vfs-cache-max-age 1h”和”–vfs-cache-max-size 10G”分别表示缓存文件最大存活时间和大小。</p><p>“–transfers 16”设置最大上传并发为16，按自己的上传网速设置。</p><p>“–checkers 16”设置文件检查并发为16，可以让你在打开文件很多的文件夹中转得快一点。</p><p>如果显示<code>symlinks not supported without the --links flag: /</code>什么的，你可以在后面加上”–links”解决，应该不会影响什么</p><p>如果你发现挂载的硬盘容量太过夸张，是因为你所使用的webdav没有向rclone返回存储总大小这些信息，你可以用”–vfs-disk-space-total-size &lt;大小&gt;”参数来设定磁盘显示的大小，只会影响显示，不会影响实际存储使用。例：”rclone mount test:\ Z: –vfs-disk-space-total-size 100G”则挂载的Z盘会显示硬盘容量共为100G。</p><h2 id="配置NSSM"><a href="#配置NSSM" class="headerlink" title="配置NSSM"></a>配置NSSM</h2><p><strong>nssm是一个服务封装程序，它可以将普通exe程序封装成服务，实现开机自启动，并且可以自动重启嗝屁的程序</strong></p><img lazyload src="/images/loading.svg" data-src="/RcloneMount/image-20250302015955872.png" class title="image-20250302015955872"><p>打开命令行工具，输入”nssm install”便可打开NSSM的窗口，在”Path”一栏输入rclone.exe的文件路径，”Startup directory”一栏输入rclone.exe所在目录,”Arguments”栏输入上面的挂载命令，但是<strong>删除</strong>命令最前面的rclone，只需要从mount开始的后面部分，”Service name”输入一个你认得出来也记得住的服务名称。</p><img lazyload src="/images/loading.svg" data-src="/RcloneMount/image-20250302025243456.png" class title="image-20250302025243456"><p>然后我们选择到Log on选项卡，将”Log on as”切换为”This account”，右侧输入框输入.\ &lt;你当前登录的用户名&gt; ,下面两栏是密码和再次输入密码确认，密码同样填写你所登录账号的密码。</p><p>完成配置后重启便可在文件管理器里看到你所挂载的WebDav网盘</p><p>如果不想自动挂载，在windows服务里面手动停用服务即可，服务名称即之前你设置的”Service name”一栏的内容</p><h2 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h2><p><a href="https://www.52pojie.cn/thread-1983855-1-1.html"><strong>Windows下用rclone命令行方式将webdav映射为本地盘并开机启动</strong></a></p><p><a href="%5Brclone%E6%8C%82%E8%BD%BD%E5%90%8E%E5%A6%82%E4%BD%95%E4%BC%98%E5%8C%96%E6%80%A7%E8%83%BD%EF%BC%9F_rclone%E6%8C%82%E8%BD%BD%E6%85%A2%E6%80%8E%E4%B9%88%E8%A7%A3%E5%86%B3-CSDN%E5%8D%9A%E5%AE%A2%5D(https://blog.csdn.net/iteye_10392/article/details/143559501)">[CSDN]rclone挂载后如何优化性能？</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;准备&quot;&gt;&lt;a href=&quot;#准备&quot; class=&quot;headerlink&quot; title=&quot;准备&quot;&gt;&lt;/a&gt;准备&lt;/h2&gt;&lt;h3 id=&quot;所需软件&quot;&gt;&lt;a href=&quot;#所需软件&quot; class=&quot;headerlink&quot; title=&quot;所需软件&quot;&gt;&lt;/a&gt;所需软件&lt;/h</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.oxysc.cc/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="教程" scheme="https://blog.oxysc.cc/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="网盘" scheme="https://blog.oxysc.cc/tags/%E7%BD%91%E7%9B%98/"/>
    
  </entry>
  
  <entry>
    <title>使用Github Action自动部署到Vercel修复文章更新时间错误问题</title>
    <link href="https://blog.oxysc.cc/GhActionHexo/"/>
    <id>https://blog.oxysc.cc/GhActionHexo/</id>
    <published>2024-04-14T09:45:43.000Z</published>
    <updated>2025-03-08T17:03:30.271Z</updated>
    
    <content type="html"><![CDATA[<h2 id="问题在于哪里？"><a href="#问题在于哪里？" class="headerlink" title="问题在于哪里？"></a>问题在于哪里？</h2><p>当你使用<em>Vercel</em>或<em>Github Actions</em>自动化部署<em>Hexo</em>博客时会发现，每次<code>git push</code>都会导致文章更新时间变为此次提交修改时间，然而实际上文章并没有进行任何修改。</p><p>这个问题是由于<code>git</code>在推送更新时不会保存文件创建和修改时间等文件元数据。</p><blockquote><p>Git SCM Wiki 中的解释</p><p>Modification time on files is a feature that affects build tools. Most build tools compare the timestamp of the source(s) with the timestamp of the derived file(s). If the source is newer, then a rebuild takes place, otherwise nothing happens. This speeds up the build process a lot.</p><p>Now consider what would happen if you check out another branch, and modification times were preserved. We assume you already have a fully-built project. If a source file on that other branch has a timestamp that is older than that of the corresponding derived file, the derived file will not be built even if it is different, because the build system only compares modification times. At best, you’ll get some kind of weird secondary error; but most likely everything will look fine at first, but you will not get the same result as you would have with a clean build. That situation is unhealthy since you really do not know what code you are executing and the source of the problem is hard to find. You will end up always having to make a clean build when switching branches to make sure you are using the correct source. (Git <a class="link" href="https://git.wiki.kernel.org/index.php?title=Bisect&action=edit&redlink=1">bisect<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> is another Git procedure that checks out old and new revisions where you need a reliable rebuild.)</p><p>Git sets the current time as the timestamp on every file it modifies, but only those. The other files are left untouched, which means build tools will be able to depend on modification time and rebuild properly. If build rules change, that can cause a failure anyway, but that is a far less common problem than accidentally not rebuilding.</p></blockquote><p>来自: <a class="link" href="https://git.wiki.kernel.org/index.php/Git_FAQ#Why_isn.27t_Git_preserving_modification_time_on_files.3F">Why isn’t Git preserving modification time on files?&#x2F;为什么 Git 不保留文件的修改时间？<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p>所以当你每次使用<code>git clone</code>上传或下载的项目的文件元数据都是当前系统时间，而不是项目的创建时间。</p><p>而在<em>Hexo</em>中，文章默认会使用<strong>文件的最后修改时间</strong>作为文章的更新时间，所以CI构建之后进入博客就会看到所有文章修改时间都会变为“刚刚”或者”X分钟以前“这种地狱绘图，因为<code>git push</code>上去的文件不会保存元数据。</p><h2 id="如何修复"><a href="#如何修复" class="headerlink" title="如何修复"></a>如何修复</h2><p>这里只提供一个很有效但稍有些麻烦的方法，同时也是本站正在使用的方法</p><blockquote><p>效果</p><img lazyload src="/images/loading.svg" data-src="/GhActionHexo/QQ%E6%88%AA%E5%9B%BE20240612193058.png" class title="效果图1"></blockquote><p>由于每次更新推送后<em>Vercel</em>都会自动构建部署，我们无法对构建流程进行修改，因此需要关闭<em>Vercel</em>的自动构建，转而使用<em>Github Action</em>来将<code>Hexo</code>自动化部署到<em>Vercel</em>。</p><h3 id="实现原理"><a href="#实现原理" class="headerlink" title="实现原理"></a>实现原理</h3><p>在Next主题issue <a class="link" href="https://github.com/theme-next/hexo-theme-next/issues/893">#893<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 中<a class="link" href="https://github.com/wylu">@wylu<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>提到了这个问题，<a class="link" href="https://github.com/sli1989">@sli1989<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 提出了以下解决方案</p><blockquote><p>Hi, the updated time with CI deployment can be fixed using this. please check Continuous Integration configurations carefully.</p><div class="code-container" data-rel="Yaml"><figure class="iseeu highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Restore last modified time</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">&quot;git ls-files -z | while read -d &#x27;&#x27; path; do touch -d \&quot;$(git log -1 --format=\&quot;@%ct\&quot; \&quot;$path\&quot;)\&quot; \&quot;$path\&quot;; done&quot;</span></span><br></pre></td></tr></table></figure></div></blockquote><p>该条命令会将文件的最后修改时间修改为 Git 仓库中文件的最后提交时间，即文章的更新时间。</p><p>同样使用 <code>find</code> 命令也可以实现这个功能：</p><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">find <span class="built_in">source</span>/_posts -name <span class="string">&#x27;*.md&#x27;</span> | <span class="keyword">while</span> <span class="built_in">read</span> file; <span class="keyword">do</span> <span class="built_in">touch</span> -d <span class="string">&quot;<span class="subst">$(git log -1 --format=<span class="string">&quot;@%ct&quot;</span> <span class="string">&quot;<span class="variable">$file</span>&quot;</span>)</span>&quot;</span> <span class="string">&quot;<span class="variable">$file</span>&quot;</span>; <span class="keyword">done</span></span><br></pre></td></tr></table></figure></div><h3 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h3><p>首先，将 <code>Vercel 项目</code> 与 <code>Github 仓库</code> 的绑定关系解除，因为我们将要在 <em>Github Action</em> 中手动部署<code>Hexo</code>到 <code>Vercel</code>。</p><img lazyload src="/images/loading.svg" data-src="/GhActionHexo/20240414194345.png" class title="准备"><p>在 Github Action 中需要使用以下两个环境变量和一个秘钥：</p><ul><li>VERCEL_ORG_ID</li><li>VERCEL_PROJECT_ID</li><li>VERCEL_TOKEN</li></ul><h3 id="步骤一-获取Vercel-Access-Token"><a href="#步骤一-获取Vercel-Access-Token" class="headerlink" title="步骤一: 获取Vercel Access Token"></a>步骤一: 获取Vercel Access Token</h3><p>我们需要在 <em>Vercel</em> 中获取一段 <a class="link" href="https://vercel.com/guides/how-do-i-use-a-vercel-api-access-token">Vercel Access Token<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 用于 <em>Github Action</em> 自动化部署。</p><p><a class="link" href="https://vercel.com/account/tokens">点击直达Token创建页面<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><img lazyload src="/images/loading.svg" data-src="/GhActionHexo/20240414195409-1718192060601-4.png" class title="创建Token"><h3 id="步骤二-获取-VERCEL-ORG-ID-和-VERCEL-PROJECT-ID的值"><a href="#步骤二-获取-VERCEL-ORG-ID-和-VERCEL-PROJECT-ID的值" class="headerlink" title="步骤二: 获取 VERCEL_ORG_ID 和 VERCEL_PROJECT_ID的值"></a>步骤二: 获取 VERCEL_ORG_ID 和 VERCEL_PROJECT_ID的值</h3><p>前置条件：已安装Node.js（都用Hexo了肯定装了纯废话）</p><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#使用npm安装</span></span><br><span class="line">npm i -g vercel</span><br></pre></td></tr></table></figure></div><p>或者使用yarn</p><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#安装yarn包管理器</span></span><br><span class="line">npm install --global yarn</span><br><span class="line"></span><br><span class="line"><span class="comment">#yarn安装Vercel CLI</span></span><br><span class="line">yarn global add vercel</span><br></pre></td></tr></table></figure></div><p>然后在博客根目录下执行</p><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vercel <span class="built_in">link</span></span><br></pre></td></tr></table></figure></div><p>来创建一个 <em>Vercel</em> 项目，此操作会在博客根目录下生成一个 <code>.vercel</code> 文件夹，在.<code>vercel/project.json</code> 里面包含了 <code>VERCEL_ORG_ID</code>和 <code>VERCEL_PROJECT_ID</code>。</p><img lazyload src="/images/loading.svg" data-src="/GhActionHexo/20240414200609.png" class title="project.json"><h3 id="步骤三-在-Github-仓库中添加-secrets"><a href="#步骤三-在-Github-仓库中添加-secrets" class="headerlink" title="步骤三: 在 Github 仓库中添加 secrets"></a>步骤三: 在 Github 仓库中添加 secrets</h3><p>在你的博客所在的 <em>Github</em> <em>仓库</em>中，点击 <code>Settings</code> -&gt; <code>Secrets and Variables</code> -&gt; <code>Actions</code> 中添加以下秘钥和环境变量：</p><ul><li>VERCEL_TOKEN   ——前面创建的Vercel Access Token</li><li>VERCEL_ORG_ID  ——<code>.vercel/project.json</code>中的<code>&quot;orgId&quot;</code>字段</li><li>VERCEL_PROJECT_ID  ——<code>.vercel/project.json</code>中的<code>&quot;projectId&quot;</code>字段</li></ul><img lazyload src="/images/loading.svg" data-src="/GhActionHexo/20240414201053.png" class title="添加secrets"><h3 id="步骤四-创建-Github-Action"><a href="#步骤四-创建-Github-Action" class="headerlink" title="步骤四: 创建 Github Action"></a>步骤四: 创建 Github Action</h3><p>完成上面两条环境变量和一条密钥总共三条的创建后，接下来我们开始创建 <em>Github Action</em></p><p>在 <em>Github</em> <em>仓库</em>中创建一个名为 <code>.github/workflows/deploy.yml</code> 的文件，添加以下内容：</p><div class="code-container" data-rel="Yaml"><figure class="iseeu highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">Blog</span> <span class="string">to</span> <span class="string">Vercel</span> <span class="string">Production</span> <span class="string">Deployment</span></span><br><span class="line"><span class="attr">env:</span></span><br><span class="line">  <span class="attr">VERCEL_ORG_ID:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.VERCEL_ORG_ID</span> <span class="string">&#125;&#125;</span></span><br><span class="line">  <span class="attr">VERCEL_PROJECT_ID:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.VERCEL_PROJECT_ID</span> <span class="string">&#125;&#125;</span></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build-and-deploy:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v2</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">persist-credentials:</span> <span class="literal">false</span></span><br><span class="line">          <span class="comment"># 0 indicates all history for all branches and tags.</span></span><br><span class="line">          <span class="attr">fetch-depth:</span> <span class="number">0</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Restore</span> <span class="string">file</span> <span class="string">modification</span> <span class="string">time</span> <span class="string">🕒</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">find</span> <span class="string">source/_posts</span> <span class="string">-name</span> <span class="string">&#x27;*.md&#x27;</span> <span class="string">|</span> <span class="string">while</span> <span class="string">read</span> <span class="string">file;</span> <span class="string">do</span> <span class="string">touch</span> <span class="string">-d</span> <span class="string">&quot;$(git log -1 --format=&quot;</span><span class="string">@%ct&quot;</span> <span class="string">&quot;$file&quot;</span><span class="string">)&quot;</span> <span class="string">&quot;$file&quot;</span><span class="string">;</span> <span class="string">done</span></span><br><span class="line">        <span class="comment"># run: &quot;git ls-files -z | while read -d &#x27;&#x27; path; do touch -d \&quot;$(git log -1 --format=\&quot;@%ct\&quot; \&quot;$path\&quot;)\&quot; \&quot;$path\&quot;; done&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">Vercel-cli🔧</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">install</span> <span class="string">--global</span> <span class="string">vercel@latest</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Pull</span> <span class="string">Vercel</span> <span class="string">Environment</span> <span class="string">Information</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">vercel</span> <span class="string">pull</span> <span class="string">--yes</span> <span class="string">--environment=production</span> <span class="string">--token=$&#123;&#123;</span> <span class="string">secrets.VERCEL_TOKEN</span> <span class="string">&#125;&#125;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Build</span> <span class="string">Project</span> <span class="string">Artifacts</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">vercel</span> <span class="string">build</span> <span class="string">--prod</span> <span class="string">--token=$&#123;&#123;</span> <span class="string">secrets.VERCEL_TOKEN</span> <span class="string">&#125;&#125;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">Project</span> <span class="string">Artifacts</span> <span class="string">to</span> <span class="string">Vercel</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">vercel</span> <span class="string">deploy</span> <span class="string">--prebuilt</span> <span class="string">--prod</span> <span class="string">--token=$&#123;&#123;</span> <span class="string">secrets.VERCEL_TOKEN</span> <span class="string">&#125;&#125;</span></span><br></pre></td></tr></table></figure></div><img lazyload src="/images/loading.svg" data-src="/GhActionHexo/20240414202225.png" class title="创建文件-1"><img lazyload src="/images/loading.svg" data-src="/GhActionHexo/20240414202820.png" class title="创建文件-2"><blockquote><h4 id="注意"><a href="#注意" class="headerlink" title="注意"></a>注意</h4><p>步骤图中的<code>master</code>为作者所在使用的仓库分支名称，请以实际为准（即原Vercel自动部署时的默认分支）</p><p>点击Commit changes后弹出的选项框通常情况下会是要求你填写Commit备注的对话框，按自己看得懂来即可。</p></blockquote><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2><p>在本地仓库根目录执行<code>git pull</code>同步远程仓库更新</p><p><code>git push</code>之后，你会发现所有文章的更新日期都被同步为了在远程仓库中最后一次修改提交的时间</p><p>即，假如文章创建时间为<strong>2024-04-05 17:45:43</strong>，<code>date:</code> 同样也为<strong>2024-04-05 17:45:43</strong>，在2024-04-08 17:45:43<strong>修改</strong>，<strong>2024-04-08 17:47:21</strong>被git push更新到远程仓库，则他人看到的最后修改时间为<strong>2024-04-08 17:47:21</strong></p><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><p>本文章在编写时使用了以下链接进行参考（不分先后）</p><p><a class="link" href="https://git.wiki.kernel.org/index.php/Git_FAQ#Why_isn.27t_Git_preserving_modification_time_on_files.3F">Why isn’t Git preserving modification time on files?<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p><a class="link" href="https://github.com/theme-next/hexo-theme-next/issues/893">hexo-theme-next issue # 893<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p><a class="link" href="https://vercel.com/guides/how-can-i-use-github-actions-with-vercel">How can I use GitHub Actions with Vercel? - Vercel Docs<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p><a class="link" href="https://github.com/vercel/examples/blob/main/ci-cd/github-actions/.github/workflows/production.yaml">examples&#x2F;production.yaml at main - vercel&#x2F;examples<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p><a class="link" href="https://mrseawave.github.io/blogs/articles/2021/01/07/ci-hexo-update-time/">修复 CI 构建博客造成的更新时间错误<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;问题在于哪里？&quot;&gt;&lt;a href=&quot;#问题在于哪里？&quot; class=&quot;headerlink&quot; title=&quot;问题在于哪里？&quot;&gt;&lt;/a&gt;问题在于哪里？&lt;/h2&gt;&lt;p&gt;当你使用&lt;em&gt;Vercel&lt;/em&gt;或&lt;em&gt;Github Actions&lt;/em&gt;自动化部署&lt;e</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.oxysc.cc/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://blog.oxysc.cc/tags/Hexo/"/>
    
    <category term="Vercel" scheme="https://blog.oxysc.cc/tags/Vercel/"/>
    
    <category term="教程" scheme="https://blog.oxysc.cc/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
</feed>
