gitignore - 忽略文件夹中生成的文件,但忽略文件夹

时间:2017-12-13 15:50:54

标签: git github gulp

我有一个gulp任务,可以将资产管道到一个目录中。我想在我的项目中包含该目录,但通过.gitignore文件排除输出的文件。我的gulp任务看起来像这样:

gulp.task('styles', function() {
    return sass('app/scss/styles.scss')
    .pipe(cleanCSS())
    .pipe(gulp.dest('public/stylesheets'))
    .pipe(livereload());
});

gulp.task('scripts', function() {
    gulp.src('app/js/script.js')
    .pipe(webpack(require('./webpack.config.js')))
        .pipe(uglify())
    .pipe(gulp.dest('public/javascripts'))
    .pipe(livereload());
});

文件夹结构:

app
---js
---scss
public(NEED TO KEEP THIS)
---javascripts(NEED TO KEEP THIS)
-----scrpits.min.js**(NEED TO IGNORE THIS)**
---stylesheets(NEED TO KEEP THIS)
-----styles.css**(NEED TO IGNORE THIS)**

如果我去,请.gitignore

/public

忽略了一切,这不是我想要的。

我发现了这个问题:How can I add an empty directory to a Git repository?有人建议使用54个upvotes进行“解决方法”:

  

“Andy Lester是对的,但如果您的目录只需要为空,   而不是空的,你可以把一个空的.gitignore文件放在那里   解决方法......“

现在我走了:

app
---js
---scss
public(NEED TO KEEP THIS)
---javascripts(NEED TO KEEP THIS)
-----scrpits.min.js**(NEED TO IGNORE THIS)**
-----.gitignore
---stylesheets(NEED TO KEEP THIS)
-----styles.css**(NEED TO IGNORE THIS)**
-----.gitignore

从接受的答案中提出建议并做了:

/public/!.gitignore

但仍然没有得到理想的结果。

如何将输出文件夹提交到存储库以执行gulp任务?

3 个答案:

答案 0 :(得分:2)

好的我明白了:

/public/**/*.js
/public/**/*.css

基本上,/ public中某个级别以下任何文件夹中的任何文件都应该被忽略。

答案 1 :(得分:2)

Git根本不存储目录(也就是文件夹),它只存储提交中的文件。当Git去检查提交时,如果该提交中的某个文件需要存在某个父目录,则Git会在该点创建该父目录。这就是为什么你需要在目录中提交文件.gitignore,或者总是提交某些文件:这样Git就会提取一些文件,迫使它创建目录。

现在,这里的问题是,当Git正在尽可能快地“尽可能快地运行每个人”:-)技巧时,它可能会发现.gitignore列出目录名并且它 - 特别是Git的索引 - 在该目录中没有已经的文件,然后它甚至都不会去看看里面文件目录。这就是git add跳过!public/.gitignore指令的方式:当它环顾四周时,它发现public为目录,但其中没有文件要提交,然后找到{{} 1}}在public中,并决定根本不在内部查看 .gitignore

如果您列出public,而不是在public中列出.gitignore,那么Git必须查看public/*内部以查找其所有文件和子目录以查看如果他们可以跳过。查看内部后,它会针对public内容检查public/.gitignore.gitignore条目会说“跳过它”,但后面的public/*条目会说“不要跳过它”。然后覆盖后面的条目,!public/.gitignorepublic/.gitignoregit add --all填入Git的索引。

一旦git commit --all在索引中,它就会进入下一次提交。一旦发生这种情况,在public/.gitignore文件中列出public而不是public/*实际上是安全的,因为现在Git在目录中有一个文件,Git被迫扫描目录。 .gitignore的条目只会通过删除该条目(public/.gitignoregit rm public/.gitignore)的显式请求再次从索引删除,或移至( git rm --cached public/.gitignore - ing)没有git checkout文件的现有提交。删除索引条目后,列出public/.gitignore而不是public不再安全,因为Git可以回过头来注意public/*是目录和< / em>被忽略 Git没有强迫Git查看public内部,因此它没有查看内部并且找不到public因此没有检查例外。

当然还有其他方法可以做同样的事情。我的首选是不要在顶层列出目录:相反, public/.gitignore目录中,创建一个包含内容的public文件:

.gitignore
然后,Git必须扫描* !.gitignore 目录中的文件,因为它不会被忽略;那个目录有一个public文件,.gitignore文件说:忽略这里的所有内容,除了.gitignore这里。因为Git已经进入了目录此时,并且找到了该目录中所有文件和子目录的列表,它将针对此.gitignore单独检查每个此类文件和子目录,并忽略除.gitignore之外的所有文件和子目录本身。

答案 2 :(得分:0)

要排除子目录中的文件,请将以下内容附加到基目录中的.gitignore:

/public/scrpits.min.js
/public/styles.css
/sub-directory/file.whatever
etc...

如果这是该文件夹中的唯一项目,并且您需要保持该文件夹处于活动状态,则可以在其中放置一个空白文本文件