如何根据.gitignore(从头开始)获取git来跟踪和提交文件?

时间:2017-07-03 17:44:03

标签: git

修改的:
我的问题中的细节隐藏了问题的真实性质。但是,由于这是问题可能会向其他人显示的方式,我决定保持原样,只需添加此编辑,以及下面的答案。

我对git完全不熟悉。

我正在使用基于PHP的网站,并且只想跟踪我的文件:
即只有/plugins/my-plugins//themes/my-theme/中的文件。

由于未能实现这一点,我决定创建并使用最小的工作示例。

根据https://git-scm.com/docs/gitignore

  

排除除特定目录foo / bar之外的所有内容的示例(注意/ * - 没有斜杠,通配符也会排除foo / bar中的所有内容):
     $ cat .gitignore
     # exclude everything except directory foo/bar
     /*
     !/foo
     /foo/*
     !/foo/bar

所以,我创建了匹配的文件/文件夹:

alan@lamp ~/GitPlay$ tree -a
.
|-- .gitignore
|-- README.md
|-- foo
|   |-- bar
|   |   -- shouldNOTbeExcluded_bar.txt
|   -- shouldBeExcluded_foo.txt
-- shouldBeExcluded.txt

2 directories, 4 files
alan@lamp ~/GitPlay$ 

根据https://dzone.com/refcardz/getting-started-git

  

...通过键入以下命令将目录初始化为Git存储库:
  git init
  git add .
  git commit –m 'The first commit'

git add.之前:

alan@lamp ~/GitPlay$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .gitignore
    README.md
    foo/
    shouldBeExcluded.txt

nothing added to commit but untracked files present (use "git add" to track)
alan@lamp ~/GitPlay$ 

因此,它没有跟踪它不应该跟踪的文件。这表明它正在跟踪它应该跟踪的文件 所以也许我可以提交显然被跟踪的内容:

alan@lamp ~/GitPlay$ git commit -m 'Very first commit after git init'
On branch master

Initial commit

Untracked files:
    .gitignore
    README.md
    foo/
    shouldBeExcluded.txt

nothing added to commit but untracked files present
alan@lamp ~/GitPlay$ 

&#34;没有添加到提交&#34;。

好的,让我们添加一些内容:

alan@lamp ~/GitPlay$ git add .

现在看看发生了什么:

alan@lamp ~/GitPlay$ git status
On branch master

Initial commit

    Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   .gitignore
    new file:   README.md
    new file:   foo/bar/shouldNOTbeExcluded_bar.txt
    new file:   foo/shouldBeExcluded_foo.txt
    new file:   shouldBeExcluded.txt

alan@lamp ~/GitPlay$ 

现在它计划在下次提交中添加所有内容。这不是我想要的。

允许&#39;看看实际发生了什么:

alan@lamp ~/GitPlay$ git commit -m 'Very first commit after git init'
[master (root-commit) dca0c49] Very first commit after git init
 5 files changed, 37 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 README.md
 create mode 100644 foo/bar/shouldNOTbeExcluded_bar.txt
 create mode 100644 foo/shouldBeExcluded_foo.txt
 create mode 100644 shouldBeExcluded.txt
alan@lamp ~/GitPlay$ 

正如我所怀疑的,所有都已提交。

所以,我的问题:
如何从头开始根据.gitignore获取git来跟踪和提交文件?

还是我错过了一些基本的东西?
是正确的&#39;程序
无论.gitignore是什么,都在第一次提交时提交所有内容 然后git将根据.gitignore / git add .以后的git commit ...跟踪更改?

根据 git add all except ignoring files in .gitignore file

  

我认为您的意思是git add .,它会将所有文件添加到.gitignore中指定的回复的回购 - 您可以通过键入git status <来查看这些更改/ p>      

git add .
  这将添加所有路径并忽略.gitignore

中的匹配

哪个与我的体验不符:git add .添加所有文件并忽略.gitignore

根据
Git add . ignores .gitignore

  

.gitignore仅考虑新文件。

哪个适合我发现的内容。

进一步发挥

第一次提交后立即:

alan@lamp ~/GitPlay$ git status
On branch master
nothing to commit, working tree clean

所以我想,也许清除暂存缓存会解决问题:

alan@lamp ~/GitPlay$ git rm -r --cached .
rm '.gitignore'
rm 'README.md'
rm 'foo/bar/shouldNOTbeExcluded_bar.txt'
rm 'foo/shouldBeExcluded_foo.txt'
rm 'shouldBeExcluded.txt'

alan@lamp ~/GitPlay$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    .gitignore
    deleted:    README.md
    deleted:    foo/bar/shouldNOTbeExcluded_bar.txt
    deleted:    foo/shouldBeExcluded_foo.txt
    deleted:    shouldBeExcluded.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .gitignore
    README.md
    foo/
    shouldBeExcluded.txt

alan@lamp ~/GitPlay$ git rm -r --cached .
fatal: pathspec '.' did not match any files

alan@lamp ~/GitPlay$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    .gitignore
    deleted:    README.md
    deleted:    foo/bar/shouldNOTbeExcluded_bar.txt
    deleted:    foo/shouldBeExcluded_foo.txt
    deleted:    shouldBeExcluded.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .gitignore
    README.md
    foo/
    shouldBeExcluded.txt

alan@lamp ~/GitPlay$ git add .

alan@lamp ~/GitPlay$ git commit -m 'First commit'
On branch master
nothing to commit, working tree clean

alan@lamp ~/GitPlay$ git status
On branch master
nothing to commit, working tree clean

alan@lamp ~/GitPlay$ ll
total 24
drwxr-xr-x 4 alan alan 4096 Jul  3 15:08 ./
drwxr-xr-x 8 alan alan 4096 Jul  3 16:05 ../
drwxr-xr-x 8 alan alan 4096 Jul  3 17:16 .git/
-rw-r--r-- 1 alan alan  139 Jul  3 15:03 .gitignore
-rw-r--r-- 1 alan alan  588 Jul  3 14:47 README.md
drwxr-xr-x 3 alan alan 4096 Jul  3 15:09 foo/
-rw-r--r-- 1 alan alan    0 Jul  3 15:08 shouldBeExcluded.txt

alan@lamp ~/GitPlay$ git add -f .

alan@lamp ~/GitPlay$ git status
On branch master
nothing to commit, working tree clean

所以现在我不能分阶段进行任何事情。

2 个答案:

答案 0 :(得分:0)

虽然您有一个100vh文件,但您还没有告诉git它。您需要先跟踪它:

.gitignore

完成后,您将忽略要忽略的文件。

运行git add .gitignore 不起作用的原因是因为git add .仅适用于未跟踪的文件。添加所有文件会跟踪所有内容(甚至是您想要忽略的文件),因此此时.gitignore未被使用。

答案 1 :(得分:0)

这个问题本来可以简单 如何根据.gitignore获取git来跟踪和提交文件?
正如@acsrujan在问题评论中指出的那样,git add all except ignoring files in .gitignore file已经回答了这个问题。

然而,我的问题没有表现出来,
- 由于markdown人工制品,“缩进四个空格以创建转义<pre> <code>” - 是我对Git - gitignore documentation.gitignore文件进行了复制/粘贴,将前导空格引入了 my my .gitignore档案。

这似乎与#的起始行具有相同的效果 - “以#开头的行作为注释。” - 或者可能git将这些行视为空白lines - “空行不匹配任何文件,因此它可以作为可读性的分隔符。”来自Git - gitignore documentation的引号。

删除前导空格可解决问题,.gitignore文件按预期工作。