Skip to content

Glob Patterns

Globs are used throughout Copybara to match files and directories.

glob(["pattern1", "pattern2"])
PatternMatches
*Any characters except /
**Any characters including / (recursive)
?Single character
[abc]Character class
[!abc]Negated character class
glob(["**"])
# Single extension
glob(["**/*.py"])
# Multiple extensions
glob(["**/*.py", "**/*.pyi"])
# Or with braces
glob(["**/*.{py,pyi}"])
# All files in src/
glob(["src/**"])
# Only immediate children
glob(["src/*"])
# Specific subdirectory
glob(["src/lib/**"])
# Exact file
glob(["README.md"])
# Files in any directory
glob(["**/README.md"])
# File pattern
glob(["**/test_*.py"])
glob(
include = ["**"],
exclude = ["**/internal/**"],
)
# Everything except tests
glob(
include = ["**"],
exclude = ["**/*_test.go", "**/test_*.go"],
)
# Source files only
glob(
include = ["src/**"],
exclude = [
"**/internal/**",
"**/testdata/**",
"**/*.test.ts",
],
)
# Documentation
glob(
include = ["docs/**", "*.md"],
exclude = ["docs/internal/**"],
)

What to read from origin:

core.workflow(
origin_files = glob(
include = ["src/**", "docs/**"],
exclude = ["**/internal/**"],
),
...
)

What Copybara can modify:

core.workflow(
destination_files = glob(
include = ["**"],
exclude = ["README.md", ".github/**"],
),
...
)

Filter where transforms apply:

core.replace(
before = "old",
after = "new",
paths = glob(["**/*.md"]),
)
core.remove(glob(["**/*.bak"]))

Exclude patterns take precedence over include:

glob(
include = ["src/**"], # Include all of src/
exclude = ["src/internal/**"], # But not internal/
)
# Result: src/* except src/internal/*

Include patterns are combined (union):

# These are equivalent:
glob(["src/**", "docs/**"])
glob(include = ["src/**", "docs/**"])

Exclude patterns are also combined:

glob(
include = ["**"],
exclude = ["*.tmp", "*.bak"], # Excludes both
)
glob(["*"]) # Only files in root
glob(["src/*"]) # One level deep
glob(["src/*/*"]) # Two levels deep
glob(["src/**"]) # Any depth
glob(["**/.*"]) # Hidden files
glob(["**/.git/**"]) # Git directory
# Build artifacts
exclude = [
"**/node_modules/**",
"**/dist/**",
"**/build/**",
"**/__pycache__/**",
"**/target/**",
]
# IDE files
exclude = [
"**/.idea/**",
"**/.vscode/**",
"**/*.iml",
]
# Internal content
exclude = [
"**/internal/**",
"**/*.internal.*",
"**/INTERNAL_*",
]
# Tests
exclude = [
"**/*_test.go",
"**/test_*.py",
"**/*.test.ts",
"**/testdata/**",
]

Test which files match:

Terminal window
# Use folder destination to see results
java -jar copybara.jar migrate copy.bara.sky workflow \
--folder-destination /tmp/output
# List the files
find /tmp/output -type f