- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
前言
这个问题试图消除关于应用 .gitignore 的困惑。追溯 ,不只是现在/ future .1
基本原理
我一直在寻找一种方法来追溯执行我当前的 .gitignore,好像我在第一次提交 中创建了 .gitignore .
我正在寻求的解决方案:
*.ext
!*special.ext
git rm --cached *.ext
git commit
git rm
- 这是从 git 跟踪中删除 - 但它将文件单独留在本地(您的)工作目录中。其他
git pull
之后将收到文件删除提交)
git filter-branch --index-filter 'git rm --cached *.ext'
git rm
(对于其他
git pull
的人也是如此)!
git filter-branch
命令。
最佳答案
编辑:我最近发现 git-filter-repo .这可能是一个更好的选择。调查 rationale 或许是个好主意和过滤器分支gotchas为你自己,但他们不会影响我下面的用例。
这种方法使 Git 完全忘记忽略文件( 过去 /现在/ future ),但 不是 从工作目录中删除任何内容(即使从远程重新 pull 出)。
此方法需要使用 /.git/info/exclude
(首选)或 一个 预先存在的 .gitignore
在 全部 具有要忽略/忘记的文件的提交。 1
这个方法避免在下一个 git pull
上从其他开发人员机器中删除新忽略的文件2
所有强制执行 Git 的方法都会忽略事后行为,从而有效地重写历史记录,因此具有 significant ramifications对于在此过程之后可能被提取的任何公共(public)/共享/协作存储库。 3
一般建议:从一个干净的仓库开始 - 全部提交,工作目录或索引中没有任何待处理,并进行备份 !
另外,评论/revision history的 this answer (and revision history 的 this question )可能有用/有启发性。
#commit up-to-date .gitignore (if not already existing)
#these commands must be run on each branch
#these commands are not strictly necessary if you don't want/need a .gitignore file. .git/info/exclude can be used instead
git add .gitignore
git commit -m "Create .gitignore"
#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
#if using .git/info/exclude, it will need to be modified per branch run, if the branches have differing (per-branch) .gitignore requirements.
git ls-files -z --ignored --exclude-standard | xargs -r0 git rm --cached
#Commit to prevent working directory data loss!
#this commit will be automatically deleted by the --prune-empty flag in the following command
#this command must be run on each branch
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.
git commit -m "ignored index"
#Apply standard git ignore behavior RETROACTIVELY to all commits from all branches (--all)
#This step WILL delete ignored files from working directory UNLESS they have been dereferenced from the index by the commit above
#This step will also delete any "empty" commits. If deliberate "empty" commits should be kept, remove --prune-empty and instead run git reset HEAD^ immediately after this command
git filter-branch --tree-filter 'git ls-files -z --ignored --exclude-standard | xargs -r0 git rm -f --ignore-unmatch' --prune-empty --tag-name-filter cat -- --all
#List all still-existing files that are now ignored properly
#if this command returns nothing, it's time to restore from backup and start over
#this command must be run on each branch
git ls-files --other --ignored --exclude-standard
git push origin --force --all
git push origin --force --tags
git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now
#fetch modified remote
git fetch --all
#"Pull" changes WITHOUT deleting newly-ignored files from working directory
#This will overwrite local tracked files with remote - ensure any local modifications are backed-up/stashed
git reset FETCH_HEAD
/.git/info/exclude
可以使用上面的说明应用于所有历史提交,也许是关于获取
.gitignore
的详细信息归档到需要它的历史提交中超出了此答案的范围。我想要一个合适的
.gitignore
在根提交中,就好像这是我做的第一件事一样。其他人可能不在乎
/.git/info/exclude
无论
.gitignore
在哪里,都可以完成同样的事情存在于提交历史中,显然重写历史是
非常敏感的话题,即使知道
ramifications .
git rebase
或
git filter-branch
复制外部
.gitignore
进入每个提交,例如
this question 的答案
git rm --cached
的结果来强制执行 git 忽略行为。命令可能导致新忽略的文件
删除 将来从强制推送的 Remote 中 pull 出。
--prune-empty
git filter-branch
中的标志命令(或之后的
git reset HEAD^
)通过自动删除先前的“删除所有忽略的文件”仅索引提交来避免此问题。
Tell your collaborators to rebase, not merge, any branches they created off of your old (tainted) repository history. One merge commit could reintroduce some or all of the tainted history that you just went to the trouble of purging.
git update-index --assume-unchanged </path/file>
或
git update-index --skip-worktree <file>
, 示例见
here .
关于git - 确定性追溯 .gitignore(如何让 Git 完全/追溯地忘记现在在 .gitignore 中的文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57418769/
我使用 Deflater 编写了一个备份程序SHA-1 用于存储文件和哈希值。我看到Java的Deflater使用zlib 。如果我显式设置 Deflater 的级别,无论平台和 JRE 版本如何,我
考虑以下算法: r = 2 while r >= 1: x = -1 + 2 * random.random() y = -1 + 2 * random.random() r
我正在编写一个持久保存到磁盘的映射类。我目前只允许 str键,但如果我可以使用更多类型会很好:希望最多可以是任何可散列的(即与内置 dict 相同的要求),但更合理的是我会接受字符串、unicode、
我有一个不使用随机化的脚本,当我运行它时会给出不同的答案。我希望每次运行脚本时答案都是一样的。该问题似乎只发生在某些(病态)输入数据上。 该代码段来自一种计算线性系统特定类型 Controller 的
这对我来说不是问题,没有它我也可以生活,但我只是好奇这是否可能以及如何实现。 今天我了解到,scrapy.Request 不会按照启动的顺序完成。 伪代码示例: class SomeSpider(sc
我正在运行这个 SVD来自 scipy 的求解器,代码如下: import numpy as np from scipy.sparse.linalg import svds features = np
我正在尝试使用确定性 Miller-Rabin 算法实现素数检查功能,但结果并不总是正确的:在检查前 1,000,000 个数字时,它只找到 78,495 而不是 78,498。 这是使用 [2, 7
我正在审查各种 Android 声音 API,我想知道我应该使用哪一个。我的目标是获得低延迟的音频,或者至少是关于播放延迟的确定性行为。 我们遇到了很多问题,Android 声音 API 似乎很垃圾,
过去,我处理过对时间要求严格的软件开发。这些应用程序的开发基本上是这样进行的:“让我们编写代码,测试延迟和抖动,并优化它们,直到它们在可接受的范围内。”我觉得这非常令人沮丧。这不是我所说的 适当的工程
给定: SQL Server 表名为 TEST_TABLE TEST_TABLE 中名为 TEST_FIELD 的列 VARCHAR(50) NOT NULL 第 1 行:10YR3/6 第 2 行:
我在 64 位 Windows PC 上使用 Microsoft Visual Studio Community 2015,版本 14.xxx。 程序读取一个文本文件,其中每一行都是桥牌(四名玩家,每
我需要在 PHP 中创建一个可证明公平(确定性和种子)加密安全 (CS) 随机数生成器。我们正在运行 PHP 5,而 PHP 7 现在并不是一个真正的选择。但是,我找到了 PHP 7 的新 CS 函数
我是一名优秀的程序员,十分优秀!