我创建了一个名为Exploratory Data Analysis/Course Project 1/
的目录,其中包含文件household_power_consumption.txt
。我尝试将其推送到我的git仓库以获取此项目并收到有关household_power_consumption.txt
大小的警告,因此我在此行添加了.gitignore
文件:
Exploratory\ Data\ Analysis/Course\ Project\ 1/household_power_consumption.txt
我尝试按照here,here和here发布的解决方案,但这些都不适用于我。我总是收到同样的错误:
git push origin master
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (28/28), done.
Writing objects: 100% (31/31), 20.48 MiB | 221.00 KiB/s, done.
Total 31 (delta 6), reused 0 (delta 0)
remote: error: GH001: Large files detected.
remote: error: Trace: 491a8219bf1d3de4fd08a8e3ea253faa
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File Exploratory Data Analysis/Course Project 1/household_power_consumption.txt is 126.80 MB; this exceeds GitHub's file size limit of 100.00 MB
To https://github.com/jd901215/DataScience_CourseraSpecialization.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://github.com/jd901215/DataScience_CourseraSpecialization.git'
这是我项目的本地目录树:
├── Exploratory Data Analysis
│ └── Course Project 1
│ └── household_power_consumption.txt
├── .git
│ ├── branches
│ ├── COMMIT_EDITMSG
│ ├── config
│ ├── description
│ ├── FETCH_HEAD
│ ├── HEAD
│ ├── hooks
│ │ ├── applypatch-msg.sample
│ │ ├── commit-msg.sample
│ │ ├── post-update.sample
│ │ ├── pre-applypatch.sample
│ │ ├── pre-commit.sample
│ │ ├── prepare-commit-msg.sample
│ │ ├── pre-push.sample
│ │ ├── pre-rebase.sample
│ │ └── update.sample
│ ├── index
│ ├── info
│ │ └── exclude
│ ├── logs
│ │ ├── HEAD
│ │ └── refs
│ │ ├── heads
│ │ │ └── master
│ │ └── remotes
│ │ └── origin
│ │ └── master
│ ├── objects
| | ├── (Bunch of SHA-1 checksums I guess )
│ │ ├── info
│ │ └── pack
│ ├── ORIG_HEAD
│ └── refs
│ ├── heads
│ │ └── master
│ ├── remotes
│ │ └── origin
│ │ └── master
│ └── tags
├── .gitignore
├── LICENSE
├── README.md
└── R programming
├── README.md
├── Week 1 Programming assignment
│ ├── complete7.R
│ ├── complete.R
│ ├── corr.R
│ ├── pollutantmean.R
│ ├── .RData
│ ├── .Rhistory
│ └── specdata
├── Week 2 Programming assignment
│ ├── cachematrix.R
│ └── README.md
└── Week 4 Programming assignment
├── best.R
├── hospital-data.csv
├── Hospital_Revised_Flatfiles.pdf
├── outcome-of-care-measures.csv
├── .Rhistory
└── rprog-doc-ProgAssignment3.pdf
很抱歉这篇长篇文章,但我正在尝试提供必要的信息。提前致谢
答案 0 :(得分:0)
当我添加行
时为我工作Exploratory\ Data\ Analysis/Course\ Project\ 1/household_power_consumption.txt
到.gitignore
我怀疑你因为之前的提交而无法推送。虽然您在本地删除它,但我认为之前使用该文件创建了一个提交。 检查'git log',看看你在txt文件中签入的提交是否存在。
如果是,请执行
git reset --soft HEAD^
删除该提交(如果它是最新提交)。
重置提交后, 在“git status”中,如果您在以下位置看到该文件:
"Changes to be committed:" area, execute "git reset HEAD <file>".
"Changes not staged for commit:" area, execute "git checkout -- <file>".
执行'git status'并检查该文件是否在“Untracked files:”区域中。
然后,将文件添加到.gitignore。它会工作。
答案 1 :(得分:0)
首先,值得注意的是.gitignore
条目一开始并不代表人们通常认为的含义。我(稍后)会回到这里。
这个输出行明显 1 :
remote: error: Trace: 491a8219bf1d3de4fd08a8e3ea253faa
告诉你,在您尝试推送的提交集中,哪个提交包含过大的文件。
但是,要到这里,你必须知道一些关于git的东西,这些东西在各种文档中经常被解释得很糟糕。 (有关好的说明,请参阅Git Book。)在这种特殊情况下,有一点需要注意的是git push
调用了一个&#34;远程&#34;,另一台计算机上有自己独立的git存储库,然后你的git要求其他git接受你的任何新提交并将它们添加到自己的存储库中。
在这种情况下,你和你的git会调用远程&#34; origin&#34;,这是&#34;我从最初克隆的地方&#34;的标准名称。
为了说明,这里有一个简单的克隆原点的情况,其中只有三个提交,在分支master
上:
他们的git:
C1 <- C2 <- C3 <-- master
你:
$ git clone <url>
你的git :(使用网络电话拨打他们的git)&#34;这是一个网址, 你有什么?&#34;
他们的git:&#34;我有
master
指向提交C3
&#34;你的git:&#34;好的,给我,哦,我知道我还需要
C2
和C1
&#34;他们的git :(给你的git捆绑一切)
你的git:&#34; kthxbye!&#34; (打开一切,创造新的回购 这与你从他们的git中得到的相同,加上 远程名称&#34;起源&#34;和网址
现在你已经拥有了克隆,你做了一些工作并做了一些提交。我们称他们为C4
和C5
。这些C<digit>
中的每一个代表其中一个丑陋的40字符SHA-1,如491a8219bf1d3de4fd08a8e3ea253faa。每次提交&#34;指回&#34;在其父提交中,C3
指向C2
,C2
指向C1
。 (由于C1
是第一次提交,它没有出站箭头:提交指向零或更多父项,初始提交是零。)让我们在{{1现在和C4
:
C5
请注意,分支标签C1 <- C2 <- C3 <- C4 <- C5 <-- master
现在指向提交master
,不再指向C5
。
(你的git会创建一个额外的标签,C3
,指向origin/master
。这就是你的git可以告诉你是&#34;提前2&#34;提交。 git并不总是在互联网电话上保持最新的git,但是,这些信息可能会变得陈旧。但我们暂时忽略它。)
最终,您决定:
C3
这告诉你的git回到他们的git的网络电话。对话现在有点不同了:
你的git:&#34;我有一些东西给你。&#34;
他们的git:&#34;嗯,好吧,给我这些东西,我会看到。我有$ git push origin master
并且它已提交master
。&#34;你的git:&#34;好的,既然你已经
C3
了,请点击我的C3
和C4
。&#34;他们的git :(开始做检查,在这种情况下,运行&#34; pre-receive hook&#34;)
&#34; pre-receive hook&#34;是他们(无论他们是谁)写的任意代码。它可以做任何他们想做的事情,但在这种情况下,它显然(再次出现这个词:-))检查你提交的新提交。这两个提交中至少有一个在其关联的源代码树中显然有一个大文件。
这个任意代码可以只是说&#34; no&#34;,但是它打印的详细信息为什么它说&#34 34;无&#34 ;.打印的明智之处在于具有大文件的提交的标识,因为提交ID是唯一的,即使在Internet电话上也是如此,因此您将在存储库中拥有相同的ID并可以使用它可以看出出了什么问题。
在此示例中,提交C5
或提交C4
。 (大文件可以在两个提交中;远程可能在找到它首先找到的那个之后停止,而不是告诉你第二个。但无论如何它只是告诉你一个提交。)
要查看特定提交:
C5
或:
$ git log 491a8219bf1d3de4fd08a8e3ea253faa
可能有助于让人们更容易看到的其他内容是使用:
$ git show 491a8219bf1d3de4fd08a8e3ea253faa
显示添加,删除或更改的文件(通过将每次提交与其父提交进行比较)。
现在,真正的问题是如何处理这个问题。在这种特殊情况下,使用交互式rebase可能最容易,如Rewriting History section of the Git Book所示。你需要做的是更换原来的&#34;坏&#34;提交&#34; good&#34;提交。
(Git实际上并没有替换提交,它只会添加新的提交,但是一旦你拥有了新的提交,你和你的git可以假装旧的不存在。最终 - 默认情况下,在30天左右 - 旧的遗忘提交&#34;到期&#34;并将被删除,但它们将保留到那时为止。保存意味着您可以随时从交互式rebase中的任何错误中恢复。)
为了说明,我们假设错误发生在提交$ git log --name-status
中(如果它发生在C4
它更容易修复,而这整个交互式变基数事情不是必需的,虽然它仍然有效)。我们还要进一步说 - 这似乎是合理的,因为您的C5
失败了 - 您还没有将git push
和C4
推到其他地方。 (如果有的话,对于获得当前C5
和C4
提交的人来说,生活会变得更加痛苦。)
首先运行C5
。因为你在git rebase -i
及其上游&#34; branch(就像git所说的那样)是master
,这意味着&#34;将origin/master
重新绑定到master
&#34;:即复制提交origin/master
和{{ 1}}在C4
的提示上进行新的,复制但稍微更改的提交C5
和origin/master
:
C4'
当您的编辑器中出现rebase命令时,请将提交C5'
的{{1}}行更改为 C4 <- C5 <-- [master, before rebase]
/
C1 <- C2 <- C3 <-- origin/master
\
C4' ... <-- temporary rebase branch
行。写出说明并退出编辑器。 (你不需要为pick
做任何事情,因为一旦rebase完成它就会成为最尖端的提交。如果你需要改变它,你可以简单地{{1}它。)
交互式rebase将挑选原始提交,但此时停止,此时提交C4
实际上与edit
相同(有时除了某些时间戳和其他作者/提交者)元数据)。你现在可以修改&#34;提交。
由于提交会添加您不想要的文件,因此您需要先C5
,然后使用git commit --amend
将文件保留在工作树中:
C4'
如果看起来有必要或适当,您也可以将该路径添加到C4
文件,git rm
git rm --cached
。这个文件只为您带来了一些便利,所以由您决定是否这样做。
现在您已准备好使用$ git rm --cached Exploratory\ Data\ Analysis/Course\ Project\ 1/household_power_consumption.txt
使修改后的提交.gitignore
永久保留,然后继续使用rebase:
git add
(.gitignore
标志跳过在提交消息上打开编辑器。如果你想对提交消息进行更改,请将其保留。)
git commit --amend
步骤只需复制提交C4'
,然后将其添加到临时分支的顶端即可完成rebase:
$ git commit --amend --no-edit
[master d106870] blah blah ...
$ git rebase --continue
然后 - 所有--no-edit
正在擦除标签continue
并将其粘贴到临时分支上:
C5
现在您有一组不添加大文件的提交,您可以重新运行 C4 <- C5 <-- [master, before rebase]
/
C1 <- C2 <- C3 <-- origin/master
\
C4' - C5' <-- temporary rebase branch
。你的git和他们的git将重新进行他们的对话,但是这一次,你的git将移交提交rebase
和master
,这将省略大文件。然后你的git会让他们的git将C1 <- C2 <- C3 <-- origin/master
\
C4' - C5' <-- master
标记为分支git push origin master
,大概这一次,它会没问题。
回到C4'
文件:我有时认为这个文件名称错误,因为这些文件不是git 忽略的文件。特别是,如果已经跟踪了一个文件 - 在index-git中不会忽略它。因此,如果您C5'
- 错误地编辑了一个文件,将其提交,然后将其放在C5'
中,它仍然在之前的提交中。即使你从那时起master
编辑它也是如此。
(.gitignore
中的条目执行两项操作,通常更重要的是&#34;让git不要抓住这个文件未跟踪&#34;,以便代替git add
,更好的名称可能是.gitignore
,或者其他一些。但是此文件中的条目也保持git rm
不将文件添加到索引中,如果它还没有在索引中,因此它还需要名称.gitignore
或类似名称。所以,我们只使用.gitignore
并且必须明白它并不是真正的意思&#34;忽略&#34;。)
1 &#34;明显&#34;意思是&#34;根本不明显,除非你已经写了一些预先接收的钩子。&#34;