AI驱动的README生成器
我对冗余任务的容忍度非常低,这是AI如此令人兴奋的前景的一部分。效率低下的一种是手动更新项目的README.md文件。如果你曾经发现保持最新或希望以一种毫不费力地生成详细,一致的文档的方式很乏味,那么你就在正确的位置。通过组合git钩,一些bash脚本和大型语言模型,你可以自动化生成READMD.md文件的过程,从而确保你的文档与代码库一样新鲜。
在本文中,我们将介绍建立一个使用Git钩子和Ollama Llama3模型自动生成和更新README.md的方法。 用LLM处理文档问题,这将使你可以专注于代码。
为什么要自动化README的生成?
为每个存储库维持高质量的README.md可能很乏味。好的README应该:
- 提供该项目的概述。
- 详细的安装步骤,使用示例和依赖项。
- 包括有关如何贡献,许可和有用链接的信息。
通过自动化此过程,我们可以节省时间并避免手动错误,同时确保记录了项目结构的关键方面。
1、先决条件
在运行脚本之前,请确保在系统上安装和配置Ollama CLI。您可以通过执行以下命令来验证Ollama正在运行:
ollama list
如果Ollama处于活动状态,你将看到其当前状态和任何运行模型。如果不是,请按照Ollama安装指南进行设置。
先决条件到位后,将脚本保存为存储库中的固定钩子。确保授予其执行权限:
chmod +x .git/hooks/post-commit
该脚本将在每次提交后自动运行,使你的README保持最新。
2、Post-Commit钩子概述
Post-Commit钩子是每个git提交之后运行的脚本。我们利用它:
- 生成README.md文件。
- 使用Llama 3模型对项目进行全面描述。
- 自动提交README.md文件,使用标志机制避免无限循环。
让我们开始:
# File path to the README
README_FILE="README.md"
# Temporary flag file to prevent infinite loop
FLAG_FILE=".readme_generated"
# Check for files that have been changed
CHANGED_FILES=$(git diff --cached --name-only)
# If the flag file exists, skip the hook to avoid the infinite loop
if [ -f "$FLAG_FILE" ]; then
echo "README already generated, skipping hook."
rm "$FLAG_FILE" # Clean up flag file for future commits
exit 0
fi
# If only the README file is changed, skip the hook to avoid infinite loop
if [[ "$CHANGED_FILES" == "$README_FILE" ]]; then
echo "Only README.md has changed. Skipping README generation."
exit 0
fi
3、收集项目信息
脚本需要收集基本的项目信息,例如名称,版本,描述和依赖项。这是这样做的:
- node.js项目:如果有一个
package.json
,我们提取项目的名称,版本,描述和依赖项。 - python项目:如果找到
requirements.txt
文件,则可以将依赖项提取并将其包括在README中。
# Get repository URL from git config
REPO_URL=$(git config --get remote.origin.url)
# Initialize project info
PROJECT_INFO=""
# Extract project name, version, and description from package.json (Node.js example)
if [ -f "package.json" ]; then
PROJECT_NAME=$(jq -r '.name' package.json)
PROJECT_VERSION=$(jq -r '.version' package.json)
PROJECT_DESCRIPTION=$(jq -r '.description' package.json)
DEPENDENCIES=$(jq -r '.dependencies | keys | join(", ")' package.json)
PROJECT_INFO+="Project: $PROJECT_NAME\nVersion: $PROJECT_VERSION\nDescription: $PROJECT_DESCRIPTION\nDependencies: $DEPENDENCIES\n"
fi
# If it's a Python project with requirements.txt, extract dependencies
if [ -f "requirements.txt" ]; then
DEPENDENCIES=$(cat requirements.txt | tr '\n' ', ')
PROJECT_INFO+="Python Dependencies: $DEPENDENCIES\n"
fi
4、提取文件夹结构和关键文件
接下来,我们提取项目的文件夹结构(不包括 .git
目录),并获取重要文件列表,例如 .js
, .py
和 .ipynb
。该脚本甚至抓住每个文件的前五行,为每个文件的作用提供一些上下文。
# Extract folder structure
FOLDER_STRUCTURE=$(find . -maxdepth 2 -type d | grep -v '\.git')
# Extract a list of key files with brief summaries (e.g., first 5 lines of each)
KEY_FILES=$(find . -maxdepth 1 -type f \( -name "*.js" -o -name "*.py" -o -name "*.ipynb" \))
FILE_SUMMARIES=""
for file in $KEY_FILES; do
FILE_CONTENT=$(head -n 5 "$file")
FILE_SUMMARIES+="$file:\n$FILE_CONTENT\n\n"
done
5、使用Ollama生成README文件
有了收集的信息,我们创建了发送给Ollama的提示。该提示包括存储库URL,项目详细信息,文件夹结构和文件摘要。 Llama 3基于此信息生成README.md。
# Combine project info, folder structure, file summaries, and repo URL into a prompt
PROMPT="Generate a detailed README file for a project with the following details:
Repository URL: $REPO_URL
$PROJECT_INFO
Folder structure:
$FOLDER_STRUCTURE
Key files and their contents:
$FILE_SUMMARIES
Include sections: Overview, Installation, Usage, Contribution Guidelines, Repo Links, and License."
echo -e "$PROMPT"
# Use Ollama to generate README content
ollama run llama3:latest "$PROMPT" > $README_FILE
6、提交README
为了防止钩子保持触发的无限循环,我们使用一个标志文件 .readme_generated
。此文件是在生成读数之后创建的。如果钩子在随后的运行中看到此标志,它会跳过自动化的生成步骤。最后,如果更新了README,则脚本阶段并提交新文件。
# Set flag to indicate README was generated
touch "$FLAG_FILE"
# Check if the README was updated
if [[ `git status --porcelain` ]]; then
# Add the updated README file to the staging area
git add $README_FILE
# Commit the updated README
git commit -m "Auto-updated README using Ollama"
echo "README updated and committed."
else
echo "No changes detected in README."
fi
7、结束语
通过自动化README的生成,你可以通过最少的手动努力确保文档保持最新。该脚本由Llama 3语言模型提供动力,可以平稳地集成到你的git工作流程中,每次提交代码时都会生成详细的项目文档。
这是完整的脚本:
#!/bin/bash
# File path to the README
README_FILE="README.md"
# Temporary flag file to prevent infinite loop
FLAG_FILE=".readme_generated"
# Check for files that have been changed
CHANGED_FILES=$(git diff --cached --name-only)
# If the flag file exists, skip the hook to avoid the infinite loop
if [ -f "$FLAG_FILE" ]; then
echo "README already generated, skipping hook."
rm "$FLAG_FILE" # Clean up flag file for future commits
exit 0
fi
# If only the README file is changed, skip the hook to avoid infinite loop
if [[ "$CHANGED_FILES" == "$README_FILE" ]]; then
echo "Only README.md has changed. Skipping README generation."
exit 0
fi
# Get repository URL from git config
REPO_URL=$(git config --get remote.origin.url)
# Initialize project info
PROJECT_INFO=""
# Extract project name, version, and description from package.json (Node.js example)
if [ -f "package.json" ]; then
PROJECT_NAME=$(jq -r '.name' package.json)
PROJECT_VERSION=$(jq -r '.version' package.json)
PROJECT_DESCRIPTION=$(jq -r '.description' package.json)
DEPENDENCIES=$(jq -r '.dependencies | keys | join(", ")' package.json)
PROJECT_INFO+="Project: $PROJECT_NAME\nVersion: $PROJECT_VERSION\nDescription: $PROJECT_DESCRIPTION\nDependencies: $DEPENDENCIES\n"
fi
# If it's a Python project with requirements.txt, extract dependencies
if [ -f "requirements.txt" ]; then
DEPENDENCIES=$(cat requirements.txt | tr '\n' ', ')
PROJECT_INFO+="Python Dependencies: $DEPENDENCIES\n"
fi
# Extract folder structure
FOLDER_STRUCTURE=$(find . -maxdepth 2 -type d | grep -v '\.git')
# Extract a list of key files with brief summaries (e.g., first 5 lines of each)
KEY_FILES=$(find . -maxdepth 1 -type f \( -name "*.js" -o -name "*.py" -o -name "*.ipynb" \))
FILE_SUMMARIES=""
for file in $KEY_FILES; do
FILE_CONTENT=$(head -n 5 "$file")
FILE_SUMMARIES+="$file:\n$FILE_CONTENT\n\n"
done
# Combine project info, folder structure, file summaries, and repo URL into a prompt
PROMPT="Generate a detailed README file for a project with the following details:
Repository URL: $REPO_URL
$PROJECT_INFO
Folder structure:
$FOLDER_STRUCTURE
Key files and their contents:
$FILE_SUMMARIES
Include sections: Overview, Installation, Usage, Contribution Guidelines, Repo Links, and License."
echo -e "$PROMPT"
# Use Ollama to generate README content
ollama run llama3:latest "$PROMPT" > $README_FILE
# Set flag to indicate README was generated
touch "$FLAG_FILE"
# Check if the README was updated
if [[ `git status --porcelain` ]]; then
# Add the updated README file to the staging area
git add $README_FILE
# Commit the updated README
git commit -m "Auto-updated README using Ollama"
echo "README updated and committed."
else
echo "No changes detected in README."
fi
你可以在github存储库中查看此设置的示例。
原文链接:Automate README Generation With Ollama (Llama 3) and Git Hooks
汇智网翻译整理,转载请标明出处