Copy trees incrementally and exclude what you do not want.
rsync
Dry run before anything moves
rsync -avn --delete source/ dest/
-n is a rehearsal. Read the list it prints before repeating without it.
Keep the trailing slash meaningful
rsync -a source/ dest # contents of source into dest
rsync -a source dest # source itself as a directory inside dest
Exclude what should not travel
rsync -a --exclude='.git/' --exclude='node_modules/' src/ dest/
Resume a large transfer
rsync -avP --partial src/ dest/
-P combines partial progress and partial-file resume, which matters when the link drops mid-archive.