配置博客自动改图片路径和自动剪切图片的尝试

regex = r'![.?]((.?))'

这个正则表达式是用来匹配Markdown文档中图片链接格式的。

让我们逐步分解一下这个正则表达式:

  • !: 在Markdown中,图片链接是以感叹号!开头的,所以正则表达式首先会查找感叹号。
  • [`: 紧跟着感叹号的是一个左方括号`[`,在正则表达式中方括号是一个特殊字符,用于定义字符集(character class)。因此,我们需要使用反斜杠来转义它,以匹配文本中的实际方括号。
    • .*?: 然后是点号*和问号?的组合。 - 点号.代表任何单个字符(除了换行符)。 - 星号*表示重复前面的字符零次或多次。 - 问号?在这里是一个非贪婪(non-greedy)限定符,它告诉正则表达式引擎匹配尽可能少的字符,直到遇到下一个模式。
    • \]``: 这部分是查找与前面的左方括号相对应的右方括号]`,同样地,由于方括号在正则表达式中有特殊含义,我们使用反斜杠``进行转义。
  • \(\): 这两个是用来匹配实际的左右圆括号(),这两个圆括号用来括起Markdown中图片链接的URL路径,因为在正则表达式中圆括号具有特殊的分组功能,所以需要使用反斜杠\来转义它们。
  • (.*?): 这是一个捕获组(capturing group):
    • 括号()定义了一个捕获组,用来捕获和存储匹配的数据以便将来引用。
    • 点号.*同样表示匹配任何字符零次或多次。
    • 问号?使得匹配变得非贪婪,即匹配尽量少的字符。

综上所述,正则表达式r'!\[.*?\]\((.*?)\)'整体查找的是一个标记了图片图像且不包含换行符的Markdown链接,它匹配以![]开始,紧跟一个括号内含任意字符(非贪婪匹配)的字符串。括号内的匹配部分(即图片的URL路径)被捕获以便之后使用。

每次上传博客md文件和图像需要g还是d

当你上传博客的Markdown文件和图像后,通常你需要先执行hexo generate(或其简写hexo g)来生成最新的静态文件,然后执行hexo deploy(或其简写hexo d)将这些静态文件部署到服务器上。

具体步骤通常是这样的:

  1. 更新Markdown文件和图像到你的博客项目目录中。
  2. 在命令行中运行hexo g来生成网站的静态内容。这个过程会将你的Markdown和图像文件转换为网页文件,并将它们存放在public目录下。
  3. 完成网站的静态内容生成后,运行hexo d来部署这些内容到指定的服务器上,例如GitHub Pages。

如果你已经配置了Hexo的一键部署功能,在运行hexo d时,Hexo会自动将public目录中的内容推送到远程仓库,网站即会相应更新。

请记住,每次对博客内容做出更改,比如添加或编辑文章,或者更改图像等,你都需要运行这两个命令以确保你的更改被应用并展示在你的线上博客中。

error: cannot spawn .git/hooks/pre-commit: No such file or directory Everything up-to-date branch 'master' set up to track 'git@github.com:ltspace/ltspace.github.io.git/master'.

这个错误信息表明Git在尝试执行pre-commit钩子时没有找到这个文件,这可能是由于以下几个原因造成的:

  1. pre-commit钩子文件可能没有正确放置在.git/hooks目录中。
  2. pre-commit文件可能没有执行权限(在Windows环境下通常不需要设置执行权限,但有时可能受特定的环境配置影响)。
  3. 如果你使用Windows,并且手动创建了pre-commit文件,可能会不知不觉地给文件加上了默认的.txt等扩展名。

针对以上情况,请检查以下几点:

  • 确认pre-commit文件位于正确的目录:.git/hooks
  • 确认文件名确实是pre-commit,没有隐藏的扩展名。在Windows文件资源管理器中查看文件名时,要确保设置允许显示已知文件类型的扩展名。
  • 如果是通过文本编辑器创建的钩子脚本,确保在保存时选择“所有文件”类型,以避免自动添加扩展名。
  • 尝试直接在命令行中执行pre-commit钩子脚本来看是否能正确运行。如果不能,可能是脚本本身存在问题,或者你的环境中没有安装Python或者脚本的执行路径不对(在脚本的开头#!/bin/sh可能需要指向正确的shell路径,这在Windows中通常不是必须的,但是依赖于你的环境配置)。

如果上述都没问题,你可以尝试删除pre-commit钩子并重新创建它。如果错误仍然存在,那么需要对你的Git安装和配置环境做更深入的查看。在极端情况下,你可能需要重新安装Git或者调查是否有其它系统级的问题影响到了Git钩子的执行。

git仓库里.git的名字是.deploy_git

如果你的 .git 文件夹的名字被改为了 .deploy_git,那很有可能是使用了Hexo的部署机制,特别是当采用hexo-deployer-git插件时,它会创建一个.deploy_git目录用来作为Git部署仓库。这个目录用于存储生成的静态文件,并将其推送到远程仓库,比如GitHub Pages。

.deploy_git目录与你本地编辑文档的Git仓库(通常用.git目录来管理)是分开的。Git钩子需要放在实际的Git仓库的.git/hooks目录中。如果你将钩子脚本放到了.deploy_git目录,那么它不会在你的常规Git操作中被触发。

解决方法如下:

  1. 确认你的本地仓库(包含你编辑的源文件)的.git目录。它应该是你项目根目录的.git文件夹,而不是Hexo生成的.deploy_git文件夹。
  2. 将你的pre-commit钩子脚本放入你项目根目录下的.git/hooks目录中。
  3. 确保pre-commit钩子脚本具有正确的内容,并且能够在你尝试提交到你的源代码仓库时被触发。

如果你尝试修改你的源代码并提交(例如使用git commit命令),那么钩子脚本应该在你项目的.git/hooks目录中被触发。如果你仅仅使用hexo deploy命令部署网站,它是不会触发这个钩子的,因为这通常会直接向.deploy_git仓库提交。

.depoly_git里还有一个.git文件夹

在Hexo项目中,.deploy_git文件夹是用于存储Hexo生成的静态文件以便部署到远程服务器的地方。当你使用hexo-deployer-git插件进行部署时,Hexo会将public目录中生成的静态文件复制到.deploy_git目录,并在该目录初始化一个新的Git仓库用于部署。

.deploy_git目录中的.git文件夹是这个用于部署的Git仓库的元数据存储位置,其中包含了版本控制的相关信息,如分支、提交历史、配置等。实际上,.deploy_git目录本身就像是一个完整的Git仓库。

当你执行hexo deploy命令时,以下步骤会被触发:

  1. Hexo调用hexo generate生成静态文件。
  2. 生成的静态文件被复制到.deploy_git目录。
  3. .deploy_git目录执行Git命令,将变更添加(commit)到本地仓库,并将其推送(push)到远程服务器(如GitHub Pages或其他托管服务)。

.git文件夹在.deploy_git目录中的作用是管理这一部署过程中所有的Git操作和历史记录。

如果你在尝试运行Git钩子时遇到问题,请确保钩子被放置于你的源代码仓库的.git/hooks目录中,而不是.deploy_git目录或其内的.git目录中。这样,当你操作源代码仓库时(比如执行git commit),钩子才会被正确触发。

image-20240309112717007

额外再执行一遍git commit的命令,只执行hexo g -d

如果要在执行 hexo g -d 的同时确保 pre-commit 钩子被触发,你需要理解 git commithexo g -d 在工作流程上的不同:

  • git commit 是Git版本控制系统的命令,当你执行它时会触发 .git/hooks 中的钩子脚本。
  • hexo g -d 是Hexo的命令,用于生成静态网站内容并将其部署到配置的服务器上,不会直接触发Git的 pre-commit 钩子。
image-20240309114430069
image-20240309114453958

把钩子放到.deploy_git的.git里,hexo g -d 直接执行钩子

理论上,你可以将钩子脚本放在 .deploy_git/.git/hooks 里面。因为这个 .git 目录确实是一个git仓库,所以它应该能认可钩子脚本。但这样做有一些需要考虑的地方:

  1. Hexo 工作流程:通常,.deploy_git 仓库用于存放生成的静态文件,而不是源文件。如果你的钩子脚本主要是为了处理源文件(比如修改Markdown文件中的图片路径),那么它应该在源文件的 git 仓库中被触发执行。
  2. 自动化程度:把钩子放在 .deploy_git 中确实可以在执行 hexo deploy 时自动处理静态文件。但如果你的钩子脚本是为了更新本地的源Markdown文件的图片路径,那么这个静态文件是由源文件生成的,所以应该在更新源文件后、生成静态文件之前就处理好。
  3. 维护性.deploy_git 目录通常不会提交到远程源码仓库,因为它的内容会在你运行 hexo clean 命令或者重新生成网站时被删除或覆盖。这意味着,如果你将钩子脚本放在 .deploy_git/.git/hooks 中,当 .deploy_git 目录被删除或重新生成时,你可能会丢失这个钩子脚本。

总结来说,虽然理论上可以将钩子放在 .deploy_git/.git/hooks 中使其在执行 hexo g -d 时自动执行,但这样做并不是实践中常见的或推荐的工作流程。通常,我们会在源码仓库中处理这些任务,以确保源码的版本控制和钩子脚本可以一起正常工作。如果你确实需要自动化此过程,可能还是需要一个在源码阶段就能够触发的自定义的脚本或命令集。

以下是将图片移动和替换绝对路径为相对路径的功能合并到一个脚本中的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import os
import re
import shutil

# 设置目标目录
target_directory = 'E:\\BLOG\\source\\images'

# 配置你的Markdown文件的路径
markdown_directory = 'E:\\BLOG\\source\\_posts'
# 配置存放图片的文件夹名称,相对于markdown_directory
images_directory = 'images'


# 替换绝对路径为相对路径的函数
def replace_image_path(file_path, image_dir):
# 建立一个正则表达式模式匹配Markdown图片链接
regex = r'!\[.*?\]\((.*?)\)'

# 读取Markdown文件内容
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()

# 使用正则表达式匹配并替换路径
new_content = content
matches = re.findall(regex, content)
for match in matches:
if not match.startswith('http'): # 只替换本地文件路径
new_image_path = os.path.join('/', image_dir, os.path.basename(match)).replace('\\', '/')
new_content = new_content.replace(match, new_image_path)

# 写回新的内容到文件
with open(file_path, 'w', encoding='utf-8') as file:
file.write(new_content)


# 写一个函数来处理文件的移动,并替换Markdown文件中图片的引用
def process_markdown_files(md_directory, target_dir):
for root, dirs, files in os.walk(md_directory):
for file in files:
if file.lower().endswith('.md'):
full_path = os.path.join(root, file)
move_images(full_path, target_dir)
replace_image_path(full_path, images_directory)


# 处理文件移动的函数
def move_images(md_file_path, target_dir):
with open(md_file_path, 'r', encoding='utf-8') as file:
content = file.read()

# 正则表达式查找所有 Markdown 图片链接
image_paths = re.findall(r'!\[.*?\]\((.*?)\)', content)

if not image_paths:
print(f"No images found in {md_file_path}")

for image_path in image_paths:
# 检查是否是绝对路径
if os.path.isabs(image_path):
# 获取图片名和目标路径
image_name = os.path.basename(image_path)
destination = os.path.join(target_dir, image_name)

# 显示正在处理的图片
print(f"Processing image: {image_name}")

# 如果目标路径下没有这个文件再进行移动
if not os.path.exists(destination):
# 尝试移动图片,如果原始图片路径不存在则会抛出异常
try:
shutil.move(image_path, destination)
print(f'Moved image {image_name} to {target_dir}')
except FileNotFoundError:
print(f'Image not found at {image_path}, skipped moving')
else:
print(f'Image {image_name} already exists in target directory; no action taken')


# 开始处理Markdown文件和图片
print(f"Processing Markdown files and images in {markdown_directory}")
process_markdown_files(markdown_directory, target_directory)

print("All Markdown file image paths and images have been processed.")

配置博客自动改图片路径和自动剪切图片的尝试
http://example.com/2024/03/09/try/
作者
LT
发布于
2024年3月9日
更新于
2024年3月23日
许可协议