我有一个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任务?
答案 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/.gitignore
或public/.gitignore
将git add --all
填入Git的索引。
一旦git commit --all
在索引中,它就会进入下一次提交。一旦发生这种情况,在public/.gitignore
文件中列出public
而不是public/*
实际上是安全的,因为现在Git在目录中有一个文件,Git被迫扫描目录。 .gitignore
的条目只会通过删除该条目(public/.gitignore
或git 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...
如果这是该文件夹中的唯一项目,并且您需要保持该文件夹处于活动状态,则可以在其中放置一个空白文本文件