关于git:在已经跟踪大量文件的现有存储库上应用.gitignore

Apply .gitignore on an existing repository already tracking large number of files

我的存储库中有一个现有的Visual Studio项目。 我最近在我的项目下添加了一个.gitignore文件,我假设它告诉Git忽略文件中列出的文件。

我的问题是所有这些文件都已被跟踪,据我所知,Git不会忽略在将规则添加到此文件之前已被跟踪的文件以忽略它。

建议使用:git rm --cached并手动取消跟踪它们,但这将永远让我一个接一个地浏览它们。

我想删除存储库并重新创建它,但这次使用.gitignore文件,但必须有更好的方法来执行此操作。


这个答案解决了我的问题:

首先,提交所有挂起的更改。

然后运行以下命令:

1
git rm -r --cached .

这将删除索引中的所有内容,然后运行:

1
git add .

承诺:

1
git commit -m".gitignore is now working"


  • 创建.gitignore文件,这样做,您只需创建任何空白的.txt文件。

  • 然后你必须在cmd上写下以下行来改变它的名字(其中git.txt是你刚刚创建的文件的名称):

    rename git.txt .gitignore

  • 然后,您可以打开文件并编写要忽略的所有未跟踪文件。例如,我的样子如下:

  • ```

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    OS junk files
    [Tt]humbs.db
    *.DS_Store

    #Visual Studio files
    *.[Oo]bj
    *.user
    *.aps
    *.pch
    *.vspscc
    *.vssscc
    *_i.c
    *_p.c
    *.ncb
    *.suo
    *.tlb
    *.tlh
    *.bak
    *.[Cc]ache
    *.ilk
    *.log
    *.lib
    *.sbr
    *.sdf
    *.pyc
    *.xml
    ipch/
    obj/
    [Bb]in
    [Dd]ebug*/
    [Rr]elease*/
    Ankh.NoLoad

    #Tooling
    _ReSharper*/
    *.resharper
    [Tt]est[Rr]esult*

    #Project files
    [Bb]uild/

    #Subversion files
    .svn

    # Office Temp Files
    ~$*

    GitHub有一整套有用的.gitignore文件

  • 一旦你有了这个,你需要像任何其他文件一样将它添加到你的git存储库,只需它必须在存储库的根目录中。

  • 然后在您的终端中,您必须写下以下行:

    git config --global core.excludesfile~ / .gitignore_global

  • 来自官方文件:

    You can also create a global .gitignore file, which is a list of rules
    for ignoring files in every Git repository on your computer. For
    example, you might create the file at ~/.gitignore_global and add some
    rules to it.

    Open Terminal. Run the following command in your terminal: git config
    --global core.excludesfile ~/.gitignore_global

    如果存储库已经存在,那么您必须运行以下命令:

    1
    2
    3
    git rm -r --cached .
    git add .
    git commit -m".gitignore is now working"

    如果步骤2不起作用,那么您应该编写要添加的文件的孔路径。


    如此处指定您可以更新索引:

    1
    git update-index --assume-unchanged /path/to/file

    通过执行此操作,文件将不会显示在git statusgit diff中。

    要再次开始跟踪文件,您可以运行:

    1
    git update-index --no-assume-unchanged /path/to/file


    如果您添加.gitignore太晚,git将继续跟踪已提交的文件,无论如何。 要解决此问题,您始终可以删除不需要的文件的所有缓存实例。

    首先,要检查您实际跟踪的文件,可以运行:

    git ls-tree --name-only --full-tree -r HEAD

    假设您在cache/这样的目录中发现了不需要的文件,因此,定位该目录而不是所有文件更安全。

    所以代替:

    git rm -r --cached .

    定位不需要的文件或目录更安全:

    git rm -r --cached cache/

    然后继续添加所有更改,

    git add .

    并承诺......

    <5233>

    参考:https://amyetheredge.com/code/13.html


    以下是一种"解锁"当前排除模式集下将被忽略的文件的方法:

    1
    2
    3
    (GIT_INDEX_FILE=some-non-existent-file \
    git ls-files --exclude-standard --others --directory --ignored -z) |
    xargs -0 git rm --cached -r --ignore-unmatch --

    这会将文件保留在工作目录中,但会将其从索引中删除。

    这里使用的技巧是为git ls-files提供一个不存在的索引文件,以便它认为没有跟踪文件。上面的shell代码询问如果索引为空将被忽略的所有文件,然后使用git rm将它们从实际索引中删除。

    在文件"未跟踪"之后,使用git status验证没有删除任何重要内容(如果是这样,请调整排除模式并使用git reset - path来恢复已删除的索引条目)。然后做一个新的提交,省去"crud"。

    "crud"仍然会出现在任何旧的提交中。如果你真的需要一个干净的历史记录,你可以使用git filter-branch来生成旧提交的干净版本(使用git filter-branch的nb将"重写历史记录",所以如果你有任何合作者已经拉过它,就不应该轻易做到这一点"crud"首次推出后的任何历史提交。


    我认为这是将.gitignore文件添加到现有存储库的简单方法。

    先决条件:

    您需要一个浏览器来访问您的github帐户。

    脚步

  • 在所需(现有)项目中创建一个新文件,并将其命名为.gitignore。一旦将文件命名为.gitignore,您将获得.gitignore模板的暗示性提示。使用这些模板或使用gitignore.io生成gitignore文件的内容。
  • 提交更改。
  • 现在克隆这个存储库。
  • 玩得开心!


    使用git clean
    获得有关此运行的帮助

    1
    git clean -h

    如果你想先看看会发生什么,请确保将-n开关传递给干运行:

    1
    git clean -xn

    删除gitingnored垃圾

    1
    git clean -xdf

    小心:您可能会忽略像database.yml这样的本地配置文件,这些文件也会被删除。使用风险由您自己承担。

    然后

    1
    2
    3
    git add .
    git commit -m".gitignore is now working"
    git push