Background
I'm migrating a VCS to git. This is done by checking out from the old VCS (TFSVC) and checking into a git repository via scripts.
Essentially in such a loop:
for x in $(seq 1 100)
do
tf get $x # get version x
git add . # add everything to index
git commit # commit
done
Problem
The old VCS contains a .gitignore, as a part of the migration process, I don't want these patterns to apply. This can easily be fixed using git add . --force. The problem is that there are still things that I may want to ignore.
What I've tried
I was hoping to use .git/info/exclude for the purpose, but git-add --force apparently ignores this in addition to .gitignore rules. It seems the same goes for core.excludesFile.
Ideal solution
- Exclude the rules of
.gitignore - Use the rules in
.git/info/excludeor some other exclude file or pattern - Somewhat performant, the process is slow enough as it is
- Doesn't rely on modifying the working tree
An option is of-course to simply git restore --staged $EXCLUDE_PATH_SPEC after adding everything to the index but I'm wondering if there isn't a better solution.
I seem to recall seeing an option for specifying an ignore/exclude glob but I can't seem to be able to find it.
Maybe there's a way to achieve this using a plumbing commands, like git update-index?
Edit
I've added clarification that I'd rather not rely on a solution that modifies the working tree (ie: moving/modifying .gitignore) since it's been suggested multiple times. Mainly because of these reasons:
- There are nested
.gitignorefiles - Their existence and contents rely on the state of the other VCS, I want to be in full control
- There is another VCS tracking the files and so anything modifying the working tree, besides the incremental fetching from the other VCS complicates matters
- It's in all likelihood slower (although maybe not slow enough to be a major concern)
If the standard conveniences aren't what you want, make your own with core commands.
git ls-fileslets you build your exclusions as you like, andgit update-indexwill take anything you want.git ls-files-o --othersShow other (i.e. untracked) files in the output-c --cachedShow cached files in the output-X --exclude-fromRead exclude patterns from , 1 per line.git update-index--addIf a specified file isn’t in the index already then it’s added.--removeIf a specified file is in the index but is missing then it’s removed.--stdinInstead of taking list of paths from the command line, read list of paths from the standard input