首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何不将本地删除的文件提交到git

如何不将本地删除的文件提交到git
EN

Stack Overflow用户
提问于 2013-10-07 20:39:21
回答 4查看 2.1K关注 0票数 2

我们有这样一种情况,我们使用git来隐藏无数的扫描(图像),并且不希望在本地机器上保存它们;然而,git将每个本地删除(遵循此过程)视为要提交到repo,我们不希望发生这种情况。关于如何只提交额外的文件而不删除文件,有什么建议吗?

EN

回答 4

Stack Overflow用户

发布于 2013-10-07 20:54:33

对于要删除的每个文件,请执行以下操作:

代码语言:javascript
运行
复制
git update-index --assume-unchanged <file>

这应该会阻止Git要求您提交删除。

话虽如此,也许更好的解决方案是使用SFTP,并将权限设置为不允许在上载后删除或修改文件。

票数 2
EN

Stack Overflow用户

发布于 2013-10-10 10:57:35

使用Skip-Worktree位

git-update-index(1)命令提供了一些处理此问题的方法。基于这样的假设,您希望在从工作树中删除blobs时将其保留在历史记录中,您可以使用以下方法:

代码语言:javascript
运行
复制
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,因为它对索引进行操作。

列出特殊的Bits和仅索引文件

要查看使用跳过工作树标记的文件,请执行以下操作:

代码语言:javascript
运行
复制
git ls-files -v | awk -v IGNORECASE=1 '$1 ~ /s/ {print}'

您还可以使用git-ls-files(1)在索引中查找已从工作树中删除的文件。

票数 2
EN

Stack Overflow用户

发布于 2013-10-10 10:21:41

(编辑:将有效负载打包为自包含脚本)

您正在寻找一个几乎只具有状态的本地存储库,该存储库跟踪您所创建的所有内容的存在,但只保留最新内容的内容(在将所有内容推到上游之后)。假设你从未重用过路径名,下面是一个惯例:

一次性设置:

创建并推送一个everything分支,用于跟踪到目前为止获得的每个图像。在此基础上创建一个(仅限本地的) worktree分支。

代码语言:javascript
运行
复制
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。从工作树中删除已处理完毕的图像,在其中生成需要推送的新图像,然后提交新的工作树状态:

代码语言:javascript
运行
复制
# work work:
rm -r anything/ you\'re/ done with
create new images
git add -A .  # good gitignore patterns make life easy
git commit

要执行请求的工作,请运行

代码语言:javascript
运行
复制
merge-push-and-cleanup   # the script below

在此之后,所有内容都存储在上游,没有多余的东西留在本地,您可以进行更多的工作。

merge-push-and-cleanup 脚本:

代码语言:javascript
运行
复制
#!/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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19225182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档