我们有一种情况是使用git存储无数扫描(图像),并且一旦设置就不希望将它们保存在本地机器上;但是,git看到每个本地删除(在此过程之后)作为要提交到repo的东西,我们希望不会发生这种情况。关于如何只提交附加文件而不进行任何删除的任何想法?
答案 0 :(得分:2)
git-update-index(1)命令提供了一些处理此问题的方法。基于您希望在从工作树中删除blob时保留blob的假设,您可以使用以下内容:
git add --all
git commit --message="Add new assets to repository."
git update-index update-index --skip-worktree <files ...>
rm <files ...>
请注意,最后一行不是Git命令,因为在将它们存储在索引中之后,您将从shell 中的工作树中删除这些文件。不要误用git rm
,因为它在索引上运行。
要查看您使用skip-worktree位标记的文件:
git ls-files -v | awk -v IGNORECASE=1 '$1 ~ /s/ {print}'
您还可以使用git-ls-files(1)查找索引中已从工作树中删除的文件。
答案 1 :(得分:1)
对于要删除的每个文件,请执行以下操作:
git update-index --assume-unchanged <file>
这应该阻止Git要求你提交删除。
话虽这么说,也许更好的解决方案是使用SFTP,权限设置为禁止在上传后删除或修改文件。
答案 2 :(得分:1)
(编辑:将有效负载打包为一个独立的脚本)
你正在追踪一个几乎仅限状态的本地存储库,它跟踪你所创建的所有内容的存在,但只保留最新内容的内容(在推送所有上游之后)。假设你永远不会重复使用路径名,这就是仪式:
一次性设置:
创建并推送一个everything
分支,用于跟踪您目前所拥有的每张图片。关闭该(仅限本地)worktree
分支。
git checkout -b everything # this will be the branch you push
git push origin everything # .
git checkout -b worktree # you'll stay on this branch
工作(差不多),就好像你不想做任何特别的事情一样:
需要保留上游的所有内容都在everything
分支上,并且您已经签出了worktree
。从工作树中删除您完成的图像,在那里创建需要推送的新图像,并提交新的工作树状态:
# work work:
rm -r anything/ you\'re/ done with
create new images
git add -A . # good gitignore patterns make life easy
git commit
要执行所请求的工作,请运行
merge-push-and-cleanup # the script below
在此之后,所有内容都存储在上游,没有任何多余的内容保留在本地,您已准备好开展更多工作。
merge-push-and-cleanup
脚本:
#!/bin/sh
# Git can do "index-only" merges when the content doesn't need to be examined,
# you can casually create sideband indexes, and `git commit-tree` works on any
# tree in the repo.
(
# ^ subshell to keep G_I_F export local
export GIT_INDEX_FILE=.git/sideband-index
# make a merged index that includes everything from both branches, by
# starting from an empty merge base so all files show up as additions.
git read-tree -im $(git mktree </dev/null) worktree everything
# commit to the `everything` branch straight from the constructed index,
# reusing the commit message from `worktree`
git cat-file -p worktree | sed 1,/^$/d \
| git commit-tree -p everything -p worktree $(git write-tree --missing-ok) \
| xargs git update-ref refs/heads/everything
)
git push origin everything
# preserve the branch metadata and, just for safety, your latest images
# by packing it all up:
mkdir -p .git/preserved/pack
rm -f .git/preserved/pack/*
(
git rev-list worktree everything
git rev-parse worktree^{tree} everything^{tree}
git ls-tree -rt worktree | awk '{ print $3 }'
git ls-tree -rt everything | awk '$2 != "blob" { print $3 }'
) \
| git pack-objects .git/preserved/pack/pack
# now for the fun one:
rm -rf .git/objects/* # !!!
# put the preserved stuff back:
mv .git/preserved/pack .git/objects
答案 3 :(得分:0)
只需将图片添加到gitignore即可。你不需要将它们存储在仓库中,对吗?