.gitignore完全不理睬

时间:2015-09-11 23:55:22

标签: git gitignore

我创建了一个名为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

我尝试按照hereherehere发布的解决方案,但这些都不适用于我。我总是收到同样的错误:

 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

很抱歉这篇长篇文章,但我正在尝试提供必要的信息。提前致谢

2 个答案:

答案 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;好的,给我,哦,我知道我还需要C2C1&#34;

     

他们的git :(给你的git捆绑一切)

     

你的git:&#34; kthxbye!&#34; (打开一切,创造新的回购         这与你从他们的git中得到的相同,加上         远程名称&#34;起源&#34;和网址

现在你已经拥有了克隆,你做了一些工作并做了一些提交。我们称他们为C4C5。这些C<digit>中的每一个代表其中一个丑陋的40字符SHA-1,如491a8219bf1d3de4fd08a8e3ea253faa。每次提交&#34;指回&#34;在其父提交中,C3指向C2C2指向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了,请点击我的C3C4。&#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 pushC4推到其他地方。 (如果有的话,对于获得当前C5C4提交的人来说,生活会变得更加痛苦。)

首先运行C5。因为你在git rebase -i及其上游&#34; branch(就像git所说的那样)是master,这意味着&#34;将origin/master重新绑定到master&#34;:即复制提交origin/master和{{ 1}}在C4的提示上进行新的,复制但稍微更改的提交C5origin/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将移交提交rebasemaster,这将省略大文件。然后你的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;