git 脚本

git 查询被误删的stash,会在终端列出被删的文件的内容概览,可以通过搜索获取对应的hash

#!/bin/bash
# ================================================================
# show_all_stash.sh
# 自动列出所有 stash(含删除的、悬空的),并显示内容摘要
# ================================================================

echo "🔍 查找所有 stash(包括已删除的)..."
echo

# --- 正常 stash 列表 ---
if git stash list | grep -q .; then
  echo "🟢 当前有效 stash:"
  git stash list --date=iso
  echo

  while IFS= read -r line; do
    stash_ref=$(echo "$line" | awk -F: '{print $1}')
    echo "----------------------------------------------------"
    echo "📦 $stash_ref"
    git show --stat "$stash_ref" | head -n 15
    echo
  done < <(git stash list)
else
  echo "⚪ 当前没有有效 stash。"
  echo
fi

# --- reflog 中的 stash 记录(可能已删除) ---
echo "🕓 搜索 reflog 中已删除的 stash 记录..."
if git reflog --grep-reflog=stash | grep -q .; then
  git reflog --grep-reflog=stash | while read -r line; do
    echo "----------------------------------------------------"
    echo "🧩 Reflog: $line"
  done
else
  echo "⚪ 没有找到已删除的 stash 记录。"
fi
echo

# --- 查找悬空提交(可能是被删除的 stash)---
echo "🕳️ 搜索 Git 对象库中悬空的提交(dangling commits)..."
dangling_commits=$(git fsck --lost-found 2>/dev/null | grep "dangling commit" | awk '{print $3}')

if [ -n "$dangling_commits" ]; then
  for hash in $dangling_commits; do
    echo "----------------------------------------------------"
    echo "🔸 悬空提交: $hash"
    msg=$(git show -s --format='%s' "$hash")
    echo "📝 提交信息: $msg"
    git show --stat "$hash" | head -n 15
    echo
  done
else
  echo "⚪ 没有发现悬空提交。"
fi

echo "✅ 检查完成。"

恢复所有被误删的文件,通过上面的hash找到对应的文件夹可以获取被删的内容

#!/bin/bash
# ================================================================
# recover_lost_git_objects.sh
# 自动扫描 Git 仓库中仍能恢复的悬空提交、stash 等对象
# 并将它们的文件内容导出到 ./recovered_commits 目录
# ================================================================

set -e

OUTPUT_DIR="./recovered_commits"
mkdir -p "$OUTPUT_DIR"

echo "🔍 扫描 Git 仓库中可恢复的提交对象..."
echo

# 1️⃣ 从 lost-found 获取对象
echo "🧭 检查 .git/lost-found ..."
LOST_FOUND_COMMITS=$(find .git/lost-found -type f 2>/dev/null || true)

if [ -n "$LOST_FOUND_COMMITS" ]; then
  for file in $LOST_FOUND_COMMITS; do
    HASH=$(basename "$file")
    echo "📦 发现 lost-found 提交: $HASH"
    RECOVER_DIR="$OUTPUT_DIR/$HASH"
    mkdir -p "$RECOVER_DIR"
    git show "$HASH" > "$RECOVER_DIR/commit.patch" 2>/dev/null || true
    git archive "$HASH" | tar -x -C "$RECOVER_DIR" 2>/dev/null || true
  done
else
  echo "⚪ 没有发现 .git/lost-found 内容。"
fi
echo

# 2️⃣ 从 fsck 输出中检测悬空提交
echo "🧩 检查 git fsck 中的悬空提交..."
DANGLING_COMMITS=$(git fsck --no-reflogs 2>/dev/null | grep 'dangling commit' | awk '{print $3}' || true)

if [ -n "$DANGLING_COMMITS" ]; then
  for HASH in $DANGLING_COMMITS; do
    echo "📦 发现悬空提交: $HASH"
    RECOVER_DIR="$OUTPUT_DIR/$HASH"
    mkdir -p "$RECOVER_DIR"
    if git cat-file -e "$HASH" 2>/dev/null; then
      git show "$HASH" > "$RECOVER_DIR/commit.patch"
      git archive "$HASH" | tar -x -C "$RECOVER_DIR" 2>/dev/null || true
    else
      echo "⚠️ 无法访问对象 $HASH,可能已被回收。"
    fi
  done
else
  echo "⚪ 未发现悬空提交。"
fi
echo

echo "✅ 扫描完成。"
echo "所有恢复的内容已导出至:$OUTPUT_DIR"

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理git任何或小或大的项目。 Git 是 Linus To...
    LeoLongl阅读 1,852评论 0 0
  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 16,037评论 5 147
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 9,375评论 0 11
  • 在测试脚本时: 背景: 做一些git规范,而准备的自动化操作 介绍: Git 也具有在特定事件发生之前或之后执行特...
    太平洋_cfd2阅读 631评论 0 0
  • 一 Git. 的安装 安装了 XCode 集成了 git, 所以直接在终端使用 安装完成之后需要在终端中配置一下 ...
    lxb0706阅读 3,304评论 0 0