把数据上传GitHub,就像那种开箱魔咒,你永远不知道里面会出现什么!
echo "GitHub,你为什么要这样对我?!"
首先,我尝试了网页版上传,谁知道那东西竟然像个挑食的小孩:一次性不让上传超过100个文件,而且每个文件大小不能超过25MB。
echo "25MB? 你当我上传的是情书吗?!"
不甘心,我又尝试了VS Code的remote repository功能,能打开远程的repo,但当我想上传文件时,它就像是告诉我:“别想太多,哥!”
echo "VS Code,你也敢抛下我?!"
接下来,我试了GitHub Desktop。小文件?没问题!但大文件?哈,它看起来就像吃了个超大号馒头,难以下咽,多次尝试都在最后一步报错:连接问题。一部分小文件夹就手动了,然后发现了一个文件夹有1G多,大部分是75MB左右的文件,单个文件可以顺利上传,但两个文件一起超过150MB就要报错:连接问题。
echo "好吧,我知道你有选择性食物中毒。"
一个一个上传?我难道是回到了石器时代?
决定编个shell脚本,一步步把文件push到GitHub上。这事情肯定是交给Chat老师去做的,Chat老师10秒撸完代码告诉我:“老铁,为啥不试试Git LFS?”原来是Git的大文件存储功能!
git lfs track "大文件"
Chat老师反手就甩了一个代码给我,找到文件夹里>20M的文件用lfs处理。
cd "path/to/source/data"
# Find .csv files larger than 20MB and track them with Git LFS
find . -name "*.csv" -size +20M | while read file; do
git lfs track "$file"
done
嗯,这下方便多了!接下来,简单的add
、commit
、push
三步曲就搞定!但等等,push的时候怎么回事?好久没用GitHub,现在它变得这么“高级”?不再是Github账号的密码,Chat老师鬼魅一笑说,还要整一个所谓的“personal access token”
echo "token? 是加密货币吗?!"
经过探索,我终于在GitHub账号(不是repo)设置里的"Developer settings"找到了这个神奇的token。
echo "我应该可以回家了吧。。!"
lfs的速度貌似还可以,只不过。。。
echo "我要回家!!!!"
大文件(比如一个文件几百M以上)还是选LFS,无论是上传还是下载都会比较快,但同时一批Push多个文件的表现就不太清楚了。。
是的,最后还是用Chat老师刚才10秒撸出来的shell脚本,一个一个搬运的。。
#!/bin/bash
# Directories
SRC_DIR="path/to/source/data"
DEST_DIR="path/to/des/data"
# Navigate to the destination directory
cd "$DEST_DIR" || exit
# Loop through files larger than 10MB in the source directory
find "$SRC_DIR" -type f -size +10M | while read -r file; do
# Copy the large file to the destination directory
cp "$file" "$DEST_DIR"
# Extract the filename for commit message
FILENAME=$(basename "$file")
# Add, commit, and push the file to Git
git add .
git commit -m "Adding file $FILENAME"
git push
# Optional sleep to avoid bombarding the server
# sleep 10s
done
hmm,那么我的token和username应该保存在哪呢,Chat老师马上开始了他的长篇大论:“我有10种方式可以储存。。。”
我立马点了“闭嘴”,选择了一个最简单的。。
git config credential.helper 'store'
但就是不知道为什么,速度在200多kb,不科学啊。目测是被限速了,因为命令行输出有提示说超过50的推荐用LFS。
echo "还有20个文件,可以写个公众号"
小结,小文件可以选GitHub网页上传;vscode无论是网页版或app版似乎有一些连接的问题,都不推荐;50M以内大文件可以用git或者git桌面版,超过50M的文件使用LFS,如果多个一起上传报错,为了节省去找原因的时间,可以考虑用代码分批用上传。