我的仓库里有一些太大的shapefile,导致我对GitHub的推动失败。我最初尝试创建一个.gitignore
文件,该文件排除了shapefile包中的大多数扩展。它仍然试图推动shapefile。经过一番搜索,我发现我必须清除缓存:
git rm -rf --cached .
git add .
然而,一旦我尝试提交然后再次推送,我发现这并没有解决问题。相同的shapefile挂起了东西。经过多次搞乱后,我放弃了这个想法并决定将所有的shapefile移出回购。我再次清除缓存,添加回来,提交并试图推送到GitHub。
推送失败。 shapefile(不再在repo中)对于推送来说太大了。怎么会发生这种情况?我觉得文件不在提交中,因为它们不在repo中,不应该挂起推送。任何关于这里发生的事情的想法都将非常受欢迎。
更新:rebase选项的当前状态......
noop
# Rebase 133c6ec..133c6ec onto 133c6ec
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
更新: Reflog>>这一切都始于'添加许多图像'
133c6ec HEAD@{0}: rebase -i (finish): returning to refs/heads/master
133c6ec HEAD@{1}: rebase -i (start): checkout refs/remotes/origin/master
133c6ec HEAD@{2}: rebase -i (finish): returning to refs/heads/master
133c6ec HEAD@{3}: rebase -i (start): checkout refs/remotes/origin/master
133c6ec HEAD@{4}: rebase -i (finish): returning to refs/heads/master
133c6ec HEAD@{5}: rebase -i (start): checkout refs/remotes/origin/master
133c6ec HEAD@{6}: rebase -i (finish): returning to refs/heads/master
133c6ec HEAD@{7}: rebase -i (pick): still dealing with shp bs
0f81c71 HEAD@{8}: rebase -i (pick): Removing shapefiles
91cb472 HEAD@{9}: rebase -i (pick): Adding comments from Mullins consult - throu
83c1269 HEAD@{10}: rebase -i (pick): Adding comments from Mullins consult - thro
7677b3f HEAD@{11}: rebase -i (pick): Hopefully .gitignore is now working
97aa005 HEAD@{12}: rebase -i (pick): Adjusting gitignore
9e912cb HEAD@{13}: rebase -i (pick): Adjusting gitignore
06647c0 HEAD@{14}: rebase -i (squash): Adding many images
259d73b HEAD@{15}: rebase -i (squash): # This is a combination of 2 commits.
3b2d5e8 HEAD@{16}: rebase -i (start): checkout refs/remotes/origin/master
a585f1d HEAD@{17}: rebase: aborting
7bc98a4 HEAD@{18}: rebase -i (start): checkout refs/remotes/origin/master
a585f1d HEAD@{19}: rebase -i (finish): returning to refs/heads/master
a585f1d HEAD@{20}: rebase -i (start): checkout 9f28970
a585f1d HEAD@{21}: rebase -i (finish): returning to refs/heads/master
a585f1d HEAD@{22}: rebase -i (start): checkout refs/remotes/origin/master
:...skipping...
133c6ec HEAD@{0}: rebase -i (finish): returning to refs/heads/master
133c6ec HEAD@{1}: rebase -i (start): checkout refs/remotes/origin/master
133c6ec HEAD@{2}: rebase -i (finish): returning to refs/heads/master
133c6ec HEAD@{3}: rebase -i (start): checkout refs/remotes/origin/master
133c6ec HEAD@{4}: rebase -i (finish): returning to refs/heads/master
133c6ec HEAD@{5}: rebase -i (start): checkout refs/remotes/origin/master
133c6ec HEAD@{6}: rebase -i (finish): returning to refs/heads/master
133c6ec HEAD@{7}: rebase -i (pick): still dealing with shp bs
0f81c71 HEAD@{8}: rebase -i (pick): Removing shapefiles
91cb472 HEAD@{9}: rebase -i (pick): Adding comments from Mullins consult - throu
83c1269 HEAD@{10}: rebase -i (pick): Adding comments from Mullins consult - thro
7677b3f HEAD@{11}: rebase -i (pick): Hopefully .gitignore is now working
97aa005 HEAD@{12}: rebase -i (pick): Adjusting gitignore
9e912cb HEAD@{13}: rebase -i (pick): Adjusting gitignore
06647c0 HEAD@{14}: rebase -i (squash): Adding many images
259d73b HEAD@{15}: rebase -i (squash): # This is a combination of 2 commits.
3b2d5e8 HEAD@{16}: rebase -i (start): checkout refs/remotes/origin/master
a585f1d HEAD@{17}: rebase: aborting
7bc98a4 HEAD@{18}: rebase -i (start): checkout refs/remotes/origin/master
a585f1d HEAD@{19}: rebase -i (finish): returning to refs/heads/master
a585f1d HEAD@{20}: rebase -i (start): checkout 9f28970
a585f1d HEAD@{21}: rebase -i (finish): returning to refs/heads/master
a585f1d HEAD@{22}: rebase -i (start): checkout refs/remotes/origin/master
a585f1d HEAD@{23}: rebase: aborting
:...skipping...
133c6ec HEAD@{0}: rebase -i (finish): returning to refs/heads/master
133c6ec HEAD@{1}: rebase -i (start): checkout refs/remotes/origin/master
133c6ec HEAD@{2}: rebase -i (finish): returning to refs/heads/master
133c6ec HEAD@{3}: rebase -i (start): checkout refs/remotes/origin/master
133c6ec HEAD@{4}: rebase -i (finish): returning to refs/heads/master
133c6ec HEAD@{5}: rebase -i (start): checkout refs/remotes/origin/master
133c6ec HEAD@{6}: rebase -i (finish): returning to refs/heads/master
133c6ec HEAD@{7}: rebase -i (pick): still dealing with shp bs
0f81c71 HEAD@{8}: rebase -i (pick): Removing shapefiles
91cb472 HEAD@{9}: rebase -i (pick): Adding comments from Mullins consult - through rev chapter
83c1269 HEAD@{10}: rebase -i (pick): Adding comments from Mullins consult - through rev chapter
7677b3f HEAD@{11}: rebase -i (pick): Hopefully .gitignore is now working
97aa005 HEAD@{12}: rebase -i (pick): Adjusting gitignore
9e912cb HEAD@{13}: rebase -i (pick): Adjusting gitignore
06647c0 HEAD@{14}: rebase -i (squash): Adding many images
259d73b HEAD@{15}: rebase -i (squash): # This is a combination of 2 commits.
3b2d5e8 HEAD@{16}: rebase -i (start): checkout refs/remotes/origin/master
a585f1d HEAD@{17}: rebase: aborting
7bc98a4 HEAD@{18}: rebase -i (start): checkout refs/remotes/origin/master
a585f1d HEAD@{19}: rebase -i (finish): returning to refs/heads/master
a585f1d HEAD@{20}: rebase -i (start): checkout 9f28970
a585f1d HEAD@{21}: rebase -i (finish): returning to refs/heads/master
a585f1d HEAD@{22}: rebase -i (start): checkout refs/remotes/origin/master
a585f1d HEAD@{23}: rebase: aborting
eaadebf HEAD@{24}: rebase -i (pick): Adding comments from Mullins consult - through rev chapter
7bc98a4 HEAD@{25}: rebase -i (start): checkout refs/remotes/origin/master
a585f1d HEAD@{26}: commit: still dealing with shp bs
4bef02c HEAD@{27}: commit: Removing shapefiles
cc061ac HEAD@{28}: commit: Adding comments from Mullins consult - through rev chapter
21c5ab7 HEAD@{29}: commit: Adding comments from Mullins consult - through rev chapter
9f28970 HEAD@{30}: commit: Hopefully .gitignore is now working
a2bdbae HEAD@{31}: commit: Adjusting gitignore
c3e5128 HEAD@{32}: commit: Adjusting gitignore
8f8b96e HEAD@{33}: commit: Adding gitignore to avoid tracking shapefiles
0c14e14 HEAD@{34}: commit: Adding gitignore to avoid tracking shapefiles
3b2d5e8 HEAD@{35}: commit: Adding many images
答案 0 :(得分:3)
首先要记住的是git push
推送提交。如果碰巧包含任何文件,那纯粹是被推送的提交所需要的。
要记住的第二件事是当你做git push
时,你的git和"他们的" git(在github上运行的git命令,在这种情况下)通常有一个小的说话形式:
&#34;我已经提交<SHA-1>
我想要给你,然后我希望你设置你的分支master
(或其他任何其他branch)指向SHA-1。&#34;
&#34;好吧,我为那个分支<different SHA-1>
。告诉我在我拥有的东西和你拥有的东西之间我需要填写什么SHA-1。&#34; (除此之外还有更多,它的顺序不同,但实质上是交换谁拥有什么提交和其他对象ID。)
一旦他们知道对方拥有什么ID,发件人就会打包&#34;无论需要什么&#34;:这是一系列提交(可能是空的)和任何实体 - 主要(但不限于)文件 - 那些提交,接收器也没有。在这种情况下,发送者是你的git,接收者是他们的git,并且包中包含一些大文件。
您决定不发送大文件。这意味着你必须替换你要求你的git发送的提交,你会要求你的git发送一些新的提交。如果新提交不引用大文件,那么当你的git去发送提交时,他们的git也不会要求提供文件,而你的git也不会发送它们。
Pro Git book在"rewriting history"上有一个部分可以很好地涵盖这一点。缺少什么(至少如果您只阅读了一个部分,还有其他部分涵盖了这一部分)是一个关于rebase真正做什么的图表。
(顺便说一下,你的git repo仍会包含大文件,并且会继续这样做,直到所有对这些文件的引用都消失为止,包括那种鬼魂在历史重写操作之后留在git&#34; reflogs&#34;中的引用。如果你在历史重写期间犯了错误,这些挥之不去的鬼可以让你复活文件.Reflog条目仍然存在默认为30天,至少这些条目 - &#34;更活跃&#34; reflog条目默认持续90天 - 但除非你做了一些不寻常的事情,否则你通常可以让它们自己过期。)
git rebase
documentation有一些图表,例如:
A---B---C topic
/
D---E---F---G master
[becoming]
A'--B'--C' topic
/
D---E---F---G master
单个字母代表提交,其原因是A'
代替A
,依此类推,在rebase之后,rebase不能可以&# 39; t - 实际移动提交,它只能制作副本。原始提交仍在那里,他们只是没有像topic
这样的标签让他们可见。如果副本不同 - 而且它们是 - 则它们具有新的不同SHA-1。它是真正重要的SHA-1,至少在推送(和获取)期间。
在你的情况下,你想要在变基时做的是制造故意有缺陷的副本&#34;,其中原件有大文件,而且#34;有缺陷的&#34;副本不要。 (事实上,当然,它拥有大文件&#34;这就是缺陷,因此不太完美的副本是正确的副本,它是原件那是错的!)
交互式rebase具有额外的能力来压缩&#34;对现有提交的新提交,即根据序列中的 next 提交获取它将要制作和修改它的副本。
您要执行的操作与上图中的内容之间的另一个重大区别是,您希望新提交从与原始内容相同的点开始:
H - I <-- master [in your repo]
/
... - G <-- origin/master [i.e., what's on github as master]
这里提交H
可能是带有额外文件的缺陷,I
可能是删除额外文件的提交。如果您要求将master
推送到github并让github将其设置为master
,那么您的git和他们的git将会聊天,并确定github需要H
和I
以及一些文件 - 包括,因为H
,大文件。
如果您重写自己的历史记录,以便取代H
和I
,只需拨打一个新的H'I'
提交,就可以调用此J
为简单起见,那么您将改为使用此图表:
H - I [abandoned ghosts]
/
... - G <-- origin/master [i.e., what's on github as master]
\
J <-- master
现在你可以让你的git调用github的git并建议只发送J
,其中没有大文件。
请注意,所有这些都有两个关键:
提交G
(由origin/master
指向)没有大文件,但是在您的存储库和github上的存储库中。它是push
的共享起点:它是您在推送时首先提交 的第一次提交,因为他们已经拥有它。
提交J
(和/或您要推送的任何其他提交)必须也没有大文件。这样,当你的git与他们的git交谈时,你的git将决定它需要发送的内容不包括大文件。
最后,在推送过程中,您的一方将提交多少次提交并不重要,重要的是 这些特定提交中的内容。你可以重写那些只有你自己拥有的东西。你喜欢的经常(或很少)喜欢它。一旦您成功将这些提交提交到另一个存储库,如果您重写&#34;对于新的略有不同的副本,其他repo 仍然具有原件,而其他用户也可能已经获得它们(如果通常可以访问其他存储库)。
(你可以仍然&#34;重写历史&#34;并使用--force
推送要求其他回购放弃一些提交,包括你的原件# 39;我决定是坏的。这也没有任何本质上的错误,只是任何与你合作的人可能已经拿起那些错误的原件&#34;他们可能正在使用它们,所以你也为这些人做了更多的工作。)
最后一点,关于git rebase -i
显示空列表的事实:这表明您实际上已删除了他们没有提交的所有提交。也就是说,而不是从:
H - I <-- master
/
... - G <-- origin/master
为:
J <-- master
/
... - G <-- origin/master
您完全放弃了H
和I
,这样您的master
也会提交G
。
如果您执行rebase -i
并将squash
I
的git告诉H
,可能会发生这种情况,并且结果与文件完全相同在提交G
中。 (例如,如果与G
到H
的唯一区别是&#34;请添加大文件&#34;并且H
与I
的唯一区别是& #34;删除大文件&#34;,两者的组合与G
的没有区别。)Git允许&#34;空&#34;像往常一样使用作者,消息等提交提交,但使用与先前提交相同的树 - 但默认情况下,rebase
假设您不希望这样:它只是完全删除了已取消的提交。
如果你确实有其他已经消失的提交,那些&#34; ghost提交&#34;我之前提到的只是你需要的。要查找它们,请查看&#34; reflogs&#34;:
$ git reflog
和
$ git reflog master
这些reflog记录了HEAD
和master
(或任何其他分支)指向最近90天的位置的历史记录:两个提交的原始SHA-1 ID,他们是否会定期提交将永久保留的提交,或者只是由reflog条目保留的延迟ghost提交。