gitignore的那些事

一、简介

每个Git项目中都需要一个“.gitignore”文件,这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中。

二、常用的规则

/mtk/ 过滤整个文件夹
*.zip 过滤所有.zip文件
/mtk/do.c 过滤某个具体文件

被过滤掉的文件就不会出现在你搭建的GitHub库中了,当然本地库中还有,只是push的时候不会上传。
除了以上规则,还可以指定要将哪些文件添加到版本管理中。

!src/   不过滤该文件夹
!*.zip   不过滤所有.zip文件
!/mtk/do.c 不过滤该文件

1、配置语法:
以斜杠/开头表示目录;
以星号*通配多个字符;
以问号?通配单个字符
以方括号[]包含单个字符的匹配列表;
以叹号!表示不忽略(跟踪)匹配到的文件或目录;

此外,git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;

2、示例说明
a、规则:fd1/*
说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;
b、规则:/fd1/*
说明:忽略根目录下的 /fd1/ 目录的全部内容;
c、规则:

/*
!.gitignore
!/fw/bin/
!/fw/sf/

说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;

三、创建.gitignore文件

1、常规的windows操作

  • 根目录下创建gitignore.txt;
  • 编辑gitignore.txt,写下你的规则,例如加上node_modules/;
  • 打开命令行窗口,切换到根目录(可以直接在文件夹上面的地址栏输入cmd回车);
  • 执行命令ren gitignore.txt .gitignore。

2、 用Git Bash

  • 根目录下右键选择“Git Bash Here”进入bash命令窗口;
  • 输入vim .gitignoretouch .gitignore命令,打开文件(没有文件会自动创建);
  • 按i键切换到编辑状态,输入规则,例如node_modules/,然后按Esc键退出编辑,输入:wq保存退出。

如图:

# dependencies  npm包文件
/node_modules

# production  打包文件
/build

# misc 
.DS_Store

npm-debug.log*

.DS_Store:这个文件是Mac OS X用来存储文件夹的一些诸如自定义图标,ICON位置尺寸,窗口位置,显示列表种类以及一些像窗体自定义背景样式,颜色这样的元信息。默认情况下,Mac OS X下的每个文件夹下应该都会生成一个,包括网络介质存储盘和U盘这样的外部设备。

image

npm-debug.log:项目主目录下总是会出现这个文件,而且不止一个,原因是npm i 的时候,如果报错,就会增加一个此文件来显示报错信息,npm install的时候则不会出现。

最后需要强调的一点是,如果你不慎在创建.gitignore文件之前就push了项目,那么即使你在.gitignore文件中写入新的过滤规则,这些规则也不会起作用,Git仍然会对所有文件进行版本管理。
简单来说,出现这种问题的原因就是Git已经开始管理这些文件了,所以你无法再通过过滤规则过滤它们。因此一定要养成在项目开始就创建.gitignore文件的习惯,否则一旦push,处理起来会非常麻烦。

三、将已忽略文件取消忽略

1、从Git存储库中删除文件,请使用rm命令:

git rm 

remove命令将在本地删除文件并停止对其进行跟踪。 因此,您可以提交更改并将其推送到存储库。 现在应该将其清除。

2、在某些情况下,您可能希望保留本地文件,仅将其从存储库中删除。 为此,我们可以使用--cached标志。 它将删除文件并保存,无论是否修改,就像在本地存储库中一样

git rm --cached 

3、对于目录,您需要添加-r标志,如下所示:

git rm --cached -r 

4、让Git取消跟踪本地存储库中的所有内容,使用--cached标志以避免误删除它们,然后重新添加所有内容。 这样,Git将被迫根据您的.gitignore文件重新评估所有文件,最后,应逐步删除当前正在跟踪的所有忽略文件。 为此,请在存储库的根文件夹中使用以下命令:

git rm --cached -r .git add .

最后添加的点( . )代表当前目录的路径。 因此,这些命令:从存储库中删除所有内容,但不要从计算机中删除文件(由于--cached标志); 递归( -r ); 并且,从当前目录( . )开始。

在执行第二个命令( git add . )之后,Git将再次跟踪所有文件,并将忽略的文件标记为已删除。 理想情况下,它将显示仅包含删除操作的跟踪更改列表,因为存储库的其余部分完全没有更改。 然后,您可以提交并推送。

git add src -f

四、清洁历史

在某些情况下,从存储库中删除对象是不够的。 具有敏感信息的数据(例如存储在代码中的密码)应从Git历史记录中删除,就好像它们不存在一样。

这同样适用于将继续使用存储库内存的大型文件,即使您按照此处显示的先前步骤将其删除。 之所以如此,是因为它们仍然是历史记录的一部分,并且任何用户都可以将其重置为包含这些文件的提交。 因此,Git需要保留它们。

最简单但受限的选择是使用amend标志。 当使用amend标志提交时, Git将用新分支替换当前分支的尖端。 可以将其想像为要将新提交与上一个提交合并,从而产生一个新提交。

如果最后一次提交(当前分支的尖端)是添加不需要的文件的提交,则可以对其进行修改,使用以下方法删除该文件:

git commit --amendgit push -f

必须使用-f标志,它代表“强制”, 并忽略某些Git检查,强制其按要求进行操作。 在这种情况下,它将强制重写历史记录,删除先前的提示,并用新的提交替换它。 这样,不需要的文件将不会成为其中的一部分。

重写Git历史记录是从其中完全删除文件的方法,因此对于所有效果而言,仿佛文件从未存在过。

五、 通过变基重写历史

如果您的文件是在较早的提交中添加的,而现在您希望从历史记录中删除它们,则需要使用rebase命令。 作为上一部分中提到的分支技巧的基础,是另一个提交。

可以使用-i标志将提交交互地应用到基础中。 该标志允许用户在这样做之前编辑提交列表,从而进行更改,例如重新排列提交或删除它们。 要执行变基,请使用以下命令。 变量应该是第二次提交的哈希值,该第二次提交在添加不需要的文件之前。

git rebase -i 

例如,给定以下提交顺序:

123ac60 Commit with code321ab56 Commit with unwanted files213ad23 Commit with code413ee26 Commit with code...324cc15 Initial commit

如果您要使用提交213ad23进行213ad23 Git可能不允许您删除提交321ab56因为它是重新设置操作中的第一个提交。 还有其他选择,但最简单的选择是使用上一次提交413ee26 。 因此,您可以安全地删除提交321ab56
在我们的示例中,使用rebase命令,如下所示:

git rebase -i 413ee26

执行此命令后,将允许您为每个提交选择一个操作,包括删除一个提交的放置操作。 根据您的配置,使用交互式rebase命令将在您的终端中启动Vim。更改Git使用的默认程序。 在变基之前执行此操作。

之后,提交和操作的列表将如下所示:

pick 123ac60 Commit with codepick 321ab56 Commit with unwanted filespick 213ad23 Commit with code

选择操作按原样使用提交。 您应该保留所有其他提交作为选择,并将不需要的提交更改为丢弃。 drop命令不会删除提交,而是将其从要在新基础中应用的提交列表中删除。 由于以后我们将更改历史记录以重新建立新的历史记录,因此不需要的提交将不会在那里,就好像已被删除一样。
您的提交列表应如下所示:

pick 123ac60 Commit with codedrop 321ab56 Commit with unwanted filespick 213ad23 Commit with code

完成此操作后(在Vim中,您必须保存并关闭文件),Git将以交互方式对提交进行基础更改。 这样,您的分支便与远程分支发生冲突。 发生这种情况是因为您的分支历史记录与我们期望的远程分支有所不同。 要更改远程分支并反映所做的更改,必须执行push -f命令。

请注意,通过此操作,您将重写分支历史记录,这是一个破坏性操作,请谨慎使用! 为了安全起见,请尝试首先在本地检查存储库,以查看操作是否对存储库造成了损害。 仅在确保一切正常后,才应推送更改。

或者,您可能需要保留该提交中的某些更改( 321ab56 ),而不是完全删除它。 为此,您可以使用编辑操作。 在重新设置基准期间,Git在开始为已编辑的提交重新设置基础时将停止,并允许您像对其进行提交一样对其执行操作。 在我们的示例中,您可以删除或取消跟踪不需要的文件。
使用edit命令的提交列表应如下所示:

pick 123ac60 Commit with codeedit 321ab56 Commit with unwanted filespick 213ad23 Commit with code

编辑提交以删除不需要的文件后,您需要使用git rebase --continue要求Git继续进行重新设置操作。 其他所有操作均应按照之前的说明进行:完成变基并push -f

六、 更糟的情况

使您的.gitignore文件保持最新状态,并在推送之前始终仔细检查您的提交。 如果失败, --amend使用--amend方法,以避免在以后产生影响。 在最坏的情况下,请重新进行大型调整并检查所有内容,然后再将更改推送到您的仓库。 在这种情况下,单元测试和良好的CI是方便的工具,并且可以节省时间。
例:

target
work

# eclipse project file
.settings
.classpath
.project


# ctags
tags

# OS X
.DS_Store

# mvn versions:set
pom.xml.versionsBackup

*.deb
*.pkg
*.zip
.java-version

*.doc
*.docx
*.xls
*.xlsx
*.bak
*.jar
*.war
*.class

### Windows template
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db

# Dump file
*.stackdump

# Folder config file
[Dd]esktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msm
*.msp

# Windows shortcuts
*.lnk
### Eclipse template

.metadata
bin/
tmp/
target/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
.recommenders
.classpath
.project

# External tool builders
.externalToolBuilders/

# Locally stored "Eclipse launch configurations"
*.launch

# PyDev specific (Python IDE for Eclipse)
*.pydevproject

# CDT-specific (C/C++ Development Tooling)
.cproject

# CDT- autotools
.autotools

# Java annotation processor (APT)
.factorypath

# PDT-specific (PHP Development Tools)
.buildpath

# sbteclipse plugin
.target

# Tern plugin
.tern-project

# TeXlipse plugin
.texlipse

# STS (Spring Tool Suite)
.springBeans

# Code Recommenders
.recommenders/

# Scala IDE specific (Scala & Java development for Eclipse)
.cache-main
.scala_dependencies
.worksheet
### macOS template
# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

# User-specific stuff:
.idea/
*.iml

# CMake
cmake-build-debug/
cmake-build-release/

# Mongo Explorer plugin:
.idea/**/mongoSettings.xml

## File-based project format:
*.iws

## Plugin-specific files:

# IntelliJ
out/

# mpeltonen/sbt-idea plugin
.idea_modules/
node_modules/
.history/
# JIRA plugin
atlassian-ide-plugin.xml

# Cursive Clojure plugin
.idea/replstate.xml

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties


你可能感兴趣的:(gitignore的那些事)