切换Git分支时macOS下.DS_Store导致空文件夹残留问题求解
解决macOS切换Git分支后残留仅含.DS_Store的空文件夹问题
一、用Git钩子自动清理(推荐)
Git的post-checkout钩子会在分支切换完成后自动执行,我们可以用它扫描并清理那些只包含.DS_Store的文件夹。
实现步骤:
- 进入Git仓库根目录,创建钩子文件:
touch .git/hooks/post-checkout - 打开文件,粘贴以下脚本:
#!/bin/bash # 获取仓库根目录 repo_root=$(git rev-parse --show-toplevel) # 遍历仓库内所有目录,检查是否仅含.DS_Store find "$repo_root" -type d -exec sh -c ' dir="$1" # 收集目录下所有存在的文件(包括隐藏文件) existing_files=() for f in "$dir"/* "$dir"/.*; do [ -e "$f" ] && existing_files+=("$f") done # 过滤掉.和.. filtered_files=() for f in "${existing_files[@]}"; do filename="${f##*/}" if [ "$filename" != "." ] && [ "$filename" != ".." ]; then filtered_files+=("$f") fi done # 如果只剩.DS_Store,删除文件和文件夹 if [ "${#filtered_files[@]}" -eq 1 ] && [ "${filtered_files[0]##*/}" = ".DS_Store" ]; then echo "清理残留文件夹: $dir" rm -f "$dir/.DS_Store" rmdir "$dir" fi ' sh {} \; - 给钩子文件添加执行权限:
chmod +x .git/hooks/post-checkout
之后每次切换分支,钩子都会自动运行,清理无用的空文件夹。
二、手动清理命令
如果只是临时需要清理,在仓库根目录运行以下命令即可:
find . -type d -exec sh -c ' dir="$1" existing_files=() for f in "$dir"/* "$dir"/.*; do [ -e "$f" ] && existing_files+=("$f") done filtered_files=() for f in "${existing_files[@]}"; do filename="${f##*/}" if [ "$filename" != "." ] && [ "$filename" != ".." ]; then filtered_files+=("$f") fi done if [ "${#filtered_files[@]}" -eq 1 ] && [ "${filtered_files[0]##*/}" = ".DS_Store" ]; then rm -f "$dir/.DS_Store" rmdir "$dir" fi ' sh {} \;
三、从根源减少.DS_Store生成
通过系统配置让macOS不在Git仓库(及外部存储)生成.DS_Store,从源头减少这类问题:
# 禁止在网络存储卷生成.DS_Store defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true # 禁止在USB/本地仓库生成.DS_Store defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true
执行完后重启Finder生效:
killall Finder
内容的提问来源于stack exchange,提问作者Bashful84
相关产品推荐
相关产品推荐

