gitリポジトリからテキストファイルだけを抜き出して単一のテキストとして出力するbashスクリプトです。
stat ではなく gstat を使っているところに注意してください。
archive_and_process.bash
#!/bin/bash
current_dir=$PWD
# 一時ディレクトリの作成
temp_dir=$(mktemp -d)
# リポジトリ名の取得
repo_name=$(basename `git rev-parse --show-toplevel`)
# 現在のリポジトリをtar形式でアーカイブ
git archive -o "$temp_dir/repo_archive.tar" HEAD
# アーカイブを展開
mkdir -p "$temp_dir/$repo_name"
tar -xf "$temp_dir/repo_archive.tar" -C "$temp_dir/$repo_name"
# 展開したディレクトリに移動
cd "$temp_dir/$repo_name"
# バイナリファイルかどうかを判定する関数
is_binary_file() {
local file="$1"
local file_output
file_output=$(file "$file")
if [[ "$file_output" == *"text"* ]]; then
return 1 # テキストファイルの場合
else
return 0 # バイナリファイルの場合
fi
}
# フォルダ名の取得
folder_name=$(basename "$PWD")
# 出力ファイル名を設定
output_file="${folder_name}.txt"
# 出力ファイルを新規作成または上書き
> "$output_file"
# find コマンドの出力を取得し、ファイルに保存
echo "## Find Output" | tee -a "$output_file"
find . -type f -exec ls -lh {} \; | tee -a "$output_file"
# ソースコードセクションの開始
echo "## Source Code" | tee -a "$output_file"
# find コマンドを使用してすべてのファイルを取得
find_output=$(find . -type f)
while IFS= read -r line; do
if [[ $line != "./$output_file" ]] && ! is_binary_file "$line"; then
file_size=$(gstat -c%s "$line")
if (( file_size <= 10240 )); then
{
echo "\`\`\`file:$line"
cat "$line"
echo "\`\`\`"
echo
} | tee -a "$output_file"
echo "Processed: $line"
else
echo "Ignored (file too large): $line"
fi
else
[[ $line == "./$output_file" ]] && echo "Ignored (output file): $line" || echo "Ignored (binary file): $line"
fi
done <<< "$find_output"
# 出力ファイルサイズのセクション
output_file_size=$(gstat -c%s "$output_file")
echo "## Output File Size" | tee -a "$output_file"
echo "Output file size: $output_file_size bytes" | tee -a "$output_file"
# 標準出力への出力ではなくファイルを生成したい場合はこの行を使ってください。
# mv $output_file $current_dir
# 一時ディレクトリの削除
rm -rf "$temp_dir"
元ネタは ChatGPTにgitのリポジトリ渡すと全ソースコード.txtをダウンロードさせてくれるやつ〜〜〜〜(AIに食わせるコード一覧が欲しい時用) です。 git archive
してるとこを除けばほとんどそのまままです。kazuphさんありがとうございます。
「ほぼ手動でやるなら.sh実行もローカルでやって、.txtだけAIに食わせれば良いだけのような……。」というブックマークコメントを見て「もっともだ」と思ったので作りました。
あと archive_and_process.bash
という名前はChatGPT-4oに考えさせたんですけど、いかにもダサいので良い名前があったらご教示ください