在使用 Windows 和 Android 近十年后,我最近使用 MacBook (MacOS Ventura) 和 iPhone 11 转入了 Apple 生态系统。我需要在计算机上保留许多 Git 存储库,经过一番研究后,我决定仅保留在 MacBook 本地,而不是 iCloud Drive 上。
那么问题是我想在 iCloud Drive 上同步与这些项目相关的文档 - 包括幻灯片、文本文件、文档、电子表格和图像 - 这些文档不是 Git 存储库的一部分,而是项目的一部分。我的第一个想法是对每个都使用 .nosync,但另一个问题是 iCloud 非常难以导航,因此理想情况下,我的整个“Computing”文件夹位于“~/Computing”。
我的第二个想法是存储我想要在 iCloud 上同步的内容,然后将其别名到 ~/Computing 文件夹,这就是我现在正在做的事情。但我希望有一个可以设置一次而无需“维护”的解决方案。
在将其他存储库同步到 iCloud 时,如何防止 Git 存储库同步?
答案1
在进一步思考这个问题之后,我意识到我可以编写一个 shell 脚本来自动为所有最低级别的目录建立符号链接,这样我就可以在本地目录中保持相同的结构,cd,但仍然添加 git 存储库。
#!/bin/bash
icloud_dev_dir="$HOME/Library/Mobile Documents/com~apple~CloudDocs/dev"
personal_dev_dir="$HOME/Computing"
# Function to create aliases for files within a directory
create_aliases_for_files() {
local source_dir=$1
local target_dir=$2
find "$source_dir" -maxdepth 1 -type f -print0 | while IFS= read -r -d '' file; do
local file_name=$(basename "$file")
ln -s "$file" "$target_dir/$file_name"
sleep 1
echo "Created alias: $file -> $target_dir/$file_name"
done
}
# Function to create aliases for lowest-level directories
create_aliases_for_directories() {
local path=$1
local base_dir=$2
local relative_path=${path#"$icloud_dev_dir"}
local target_dir="$base_dir$relative_path"
if [[ "$path" != "$icloud_dev_dir" ]]; then
if [[ "$path" -ef "$target_dir" ]]; then
echo "Skipping self-referential symlink: $path"
elif [[ -z "$(find "$path" -mindepth 1 -type d)" ]]; then
ln -s "$path" "$target_dir"
sleep 1
echo "Created alias: $path -> $target_dir"
else
mkdir -p "$target_dir"
create_aliases_for_files "$path" "$target_dir"
sleep 1
echo "Created directory: $target_dir"
fi
fi
}
# Create aliases for lowest-level directories
find "$icloud_dev_dir" -type d -print0 | while IFS= read -r -d '' directory; do
create_aliases_for_directories "$directory" "$personal_dev_dir"
done
现在,我只需确保将文件和文件夹添加到 iCloud Drive,然后再次运行脚本仅当我需要将其与 git 存储库一起使用时。