我对Git中登台目录(Git Index)的命名感到困惑.
是否有任何特殊含义,称为指数?为什么不调用Cache /或Temp目录以便我们更容易理解?
对我来说,索引是帮助我们更快地搜索的东西,比如DBMS中的索引,它与暂存区域有什么关系?
我做了一些谷歌搜索,但仍然没有太多的想法.ref链接Git索引
Pro Git这本书说,暂存区域只是一个列表或索引,它表示在git commit完成后将提交哪些文件,现在这个名称index通常被称为"暂存区".
但是,如果我们修改foo.txt已经是repo的一部分的文件,并使用git add foo.txt它来暂存它,并再次修改该文件,那么现在该文件既可以"暂存"又可以"修改"(如图所示git status),如果我们提交,则"staged"版本将进入提交.第二次编辑不会进入.
那么,如果它只是一个索引 - 文件列表,那么"暂存区"如何跟踪第一次编辑的内容?
我的仓库中有一个特定的文件,我已将假设未设置的位设置为:
git update-index --assume-unchanged someFile.txt
Run Code Online (Sandbox Code Playgroud)
偶尔,在对repo进行一些工作后,该位未设置,文件自动assume-unchanged不再存在.
谁在接触它?在明确告诉git之前,我怎样才能使这个永久化:
git update-index --no-assume-unchanged someFile.txt
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
编辑:我在本地更改的配置文件上使用假定未更改的位,并且永远不应该提交,更不用说上推了.我不希望看到它们git status,也不想在其他任何地方看到它们,除非我明确告诉git我想编辑并提交其中一个.
编辑:好的,我想我设法重现了这个问题.
我从一个不同的仓库(没有它--assume-unchanged)提交文件,拉上我的仓库,果然,该位被重置.
所以出现两个问题:
我有一个由 windows 和 linux 共享的磁盘分区(格式:NTFS)。它包含一个 git 存储库(大约 6.7G)。
如果我只使用 windows或只使用 linux来操作 git 存储库,一切都很好。
但是每次我切换系统。该git status命令将刷新索引,大约需要 1 分钟。在我运行之后git status,如果我git status再次在同一个系统中运行。只需不到 1 秒。这是结果
# Just after switch from windows
[#5#wangx@manjaro:duishang_design] git status # this command takes more than 60s
Refresh index: 100% (2751/2751), done.
On branch master
nothing to commit, working tree clean
[#10#wangx@manjaro:duishang_design] git status # this time the command takes less than 1s
On branch master
nothing to commit, working …Run Code Online (Sandbox Code Playgroud) 互联网上充斥着对这个问题的不正确和不理想的答案.这是不幸的,因为你会认为这将是你想做的常见事情.
问题:当pre-commit钩子运行时,存储库可能不干净.因此,如果你天真地进行测试,他们就不会反对你提交的内容,而是你的工作树中发生的任何污垢.
最明显的事情是git stash --keep-index --include-untracked在的开始pre-commit,并git pop在出口处.这样你就可以测试(纯)索引,这就是我们想要的.
不幸的是,如果你使用它git add --patch,会生成合并冲突标记(特别是如果你编辑了),因为stash@{0}提交后内容可能与工作树不匹配.
另一个常见的解决方案是克隆存储库并在新的临时存储库中运行测试.这有两个问题:一个是我们还没有提交,所以我们不能轻易地获得我们即将提交的状态的存储库副本(我确信有一种方法可以做到这一点) ,但我不感兴趣,因为:).其次,我的测试可能对当前工作目录的位置敏感.例如,由于本地环境配置.
那么:如何在git stash --keep-index --include-untracked不引入合并冲突标记的情况下将我的工作树恢复到它所处的状态,并且不修改提交后的内容HEAD?
我喜欢直接修改配置文件(比如.gitignore和.git/config)而不是记住任意命令,但我不知道Git在哪里存储传递给"git update-index --assume-unchanged"文件的文件引用".
如果你知道,请告诉我!
该混帐书定义git的指标:
Git索引用作工作目录和存储库之间的临时区域.您可以使用索引构建一组要一起提交的更改.创建提交时,提交的内容是索引中当前的内容,而不是工作目录中的内容.
但是我仍然很难理解它,特别是突出的声明"所承诺的不是我工作目录中的内容".
到目前为止,在我有限的使用Git的工作,一切都在工作目录始终致力于,如果我这样做:
git add <all new files in the working directory>
git commit -a -m "git will refuse to commit without this comment"
Run Code Online (Sandbox Code Playgroud)
git然后提交所有修改过的文件以及所有新文件.
那么,实际上,我的工作目录是暂存区域?
我不确定git index它是什么以及它如何被解释为临时区域.
你能解释一下吗?
我正在尝试将 .patch 文件应用到我的源代码,但它失败了,因为我的文件索引 (10655) 比补丁索引 (10755) 旧。
现在我知道我可以修改补丁的文件索引,但我想知道是否有任何方法使用 git 使补丁忽略文件索引差异?
例如,我在repo中创建文件a(假设我在主分支上),然后我git add a和git commit.在那之后我git branch copy和git checkout copy.最后我在word目录中创建文件b git add b.
当我结帐回主分支时,Git似乎很聪明,并且git ls-files没有列出文件b.
所以我很困惑,因为我们index在repo中只有一个文件,git如何同时为分支维护不同的临时区域?
编辑:
如何解释分阶段但未提交的文件,仍然会记住每个分支?
git ×10
git-index ×10
command ×1
git-apply ×1
git-commit ×1
git-config ×1
git-push ×1
githooks ×1
linux ×1
pre-commit ×1
windows ×1