I export to "Source Control Entities" on my development server. I choose the applicable Project or Model Tags, and for the path I use the application name, date, and time, like "/project1_20210712.1307".
We have a Dev - QA - Prod environment. I do the development in Dev and user testing is done in QA. After exporting in Dev, I manually copy that folder from the Dev server's SystemRepository to the QA server's SystemRepository, open the QA ThingWorx Composer, and import (using Source Control Entities and browsing to the folder I copied into SystemRepository). Our testing is done on the QA server and when that's good, I copy the folder from the QA server's SystemRepository to the Prod server's SystemRepository, open the Prod ThingWorx Composer, and import.
Sometimes I update just a few Things or Mashups during development/testing for a project so I'll export from Dev with a name like "/project1_20210712.1307.incremental" and use the "Start Date" value to only export modified entities after that date, then copy to the QA server and import.
If any of the imported Things use passwords, like database connectors, the password has to be updated after import. Because the export creates readable XML files, any passwords are not included in the exported XML files. Each of our projects can have multiple database connectors, so I've been using a Thing Template that has all of the query services and the actual database connector uses the template. I do not include the actual database connector in my Project or Model Tag, just the template. That way I can update queries in the template and export/import without having to re-enter the database password or change its configuration every time I import.
I'm interested in hearing of other ways to move projects from development to production, if others have different ways of doing it.