递归地忽略特定目录中的所有文件(.json文件除外)

时间:2018-09-20 01:47:41

标签: git gitignore

我的文件结构类似于以下文件:

foo/bar.foo
node_modules/foo/bar.json
node_modules/foo/bar/foo.bar

我想做的是忽略node_modules文件夹中json文件夹内的所有文件,以便在存储库中得到以下文件结构:

foo/bar.foo
node_modules/foo/bar.json

我试图找到一种简单的方法来做到这一点,但我还没有到位。

这是我在.gitignore中想到的:

# ignore everything inside node_modules
node_modules/*

# But descend into directories
!node_modules/**/*.json

达到预期结果的最优雅的方法是什么?

P.S。我不知道我在做什么。

3 个答案:

答案 0 :(得分:3)

gitignore文档中,他们指出:

  

如果排除了该文件的父目录,则无法重新添加该文件。

这为您的规则失败的原因提供了直觉。您可以使用一些xargs魔术来手动添加缺少的json文件。每当添加新软件包时,您都必须运行此程序,但是一旦它们被跟踪,一切都会起作用。

 find node_modules/* -name *.json -print |xargs git add -f

我使用Git 2.18.0进行了测试,并确认以这种方式添加后,被忽略目录中的文件可以正常工作。对于您的-f规则所排除的更深层路径,必须使用以上.gitignore参数。

答案 1 :(得分:1)

您必须首先忽略(排除)被忽略目录的子文件夹。

library(shiny)

ui <- fluidPage(
  # uiOutput("slidertest"),
  sliderInput("slider","Update Ends?", min = 0, max=100,value=c(0,100) ),
  verbatimTextOutput("values")
)

server <- function(input, output, session) {

  sliderends <- reactiveValues(start=0,end=100)

  observeEvent(input$slider,{
    if(input$slider[1]!=sliderends$start){
      #start value change
      sliderends$start<-input$slider[1]
      updateSliderInput( session,"slider","Update Ends?", min = 0, max=100,value=c( input$slider[1] , 100-input$slider[1] ) )
    }else if(input$slider[2]!=sliderends$end){
      #end value chagne 
      sliderends$end<-input$slider[2]
      updateSliderInput( session,"slider","Update Ends?", min = 0, max=100,value=c( 100-input$slider[2] , input$slider[2] ) )
    }
  })

  output$values <- renderText({paste(input$slider[1], input$slider[2], sliderends$start, sliderends$end, sep=";")})
}

shinyApp(ui, server)

请使用# ignore everything inside node_modules node_modules/** # exclude or whitelist subfolders: note the trailing / !node_modules/**/ # But descend into directories !node_modules/**/*.json 检查哪个规则仍然会忽略您的文件。
并确保未将这些文件添加到索引(git check-ignore -v -- afile

答案 2 :(得分:0)

好,所以我终于找到了解决方案。这就是窍门:

# Ignore all the files inside the node_modules folder
node_modules/**/*.*

# Allow only json files inside the node_modules folder
!node_modules/**/*.json

问题是通过执行node_modules/*,它不仅会忽略文件,还会忽略文件夹。

正如git doc所说:

  

如果文件的父目录不能重新包含该文件   文件被排除。

因此,我改为node_modules/**/*.*,它只排除文件而不是文件夹。

这样,!node_modules/**/*.json实际上能够将json文件列入白名单。