Git Integration & Export (Reference): Comprehensive Git integration for version control, collaboration, and DevOps workflows while maintaining centralized database architecture security.
Access: Solution → Export (Git Export settings)
Git Export Architecture
Component | Function | Location |
|---|---|---|
| Centralized Database | Single source of truth | .dbsln file |
| Automatic Exports | Version control tracking | Git folder |
| Selective Export | Configuration elements | JSON files |
| Sensitive Data | Protected via placeholders | Database only |
| Bidirectional Sync | Database ↔ Git repository | Automated |
Feature | Purpose | Benefit |
|---|---|---|
| Consistent Formatting | Clean diffs | Easy review |
| Sorted Keys | Minimize conflicts | Better merging |
| Array-based Tables | Efficient storage | Smaller files |
| Metadata Preservation | Version tracking | Audit trail |
| Binary Asset Handling | Separate files with checksums | Integrity |
| Feature | Purpose | Benefit |
|---|---|---|
| Flat Directory | Simple file enumeration | Easy automation |
| Consistent Formatting | Clean diffs | Easy review |
| Sorted Keys | Minimize conflicts | Better merging |
| String Enumerations | Human-readable values | Self-documenting |
| Filtered Fields | Exclude auto-generated data | Smaller files |
| Array-based Data | Consistent structure | Simplified parsing |
Navigate to Solution → Settings → Version Control:
| Setting | Options | Default |
|---|---|---|
| Enable Git Export | On/Off | Off |
| Export Mode | Automatic/Manual | Manual |
| Export Trigger | On Version Change | - |
| Export Delay | 5-60 seconds | 5 |
| Target Directory | Path | Solution-Data\Git |
Automatic Export:
Manual Export:
All JSON files are exported to a single flat directory using standardized naming:
| Category | Pattern | Example |
|---|---|---|
| Bulk tables | {TableType}.json | UnsTags.json, AlarmsItems.json |
| Individual objects | {TableType}-{Name}.json | ScriptsTasks-ServerStartup.json |
| UserType members | UserType-{Name}.json | UserType-LabelingMachine.json |
Examples:
Git/
??? AlarmsGroups.json
??? AlarmsItems.json
??? DevicesChannels.json
??? DevicesNodes.json
??? DevicesPoints.json
??? ScriptsExpressions.json
??? ScriptsTasks-ServerStartup.json
??? ScriptsTasks-DataProcessor.json
??? UnsTags.json
??? UnsUserTypes.json
??? UserType-LabelingMachine.json
??? UserType-Motor.jsonBenefits:
ls *.json returns all filesScriptsTasks-*.json finds all script tasksjson
{
"ObjectIdentification": {
"TableType": "ScriptsTasks",
"SolutionName": "MyProject"
},
"ExportMetadata": {
"ExportDate": "2025-08-23T10:30:00Z",
"ExportUser": "john.doe",
"ExportProduct": "FrameworX",
"ExportProductVersion": "10.1.1.1011",
"ExportFormat": "1.1"
},
"Data": [
{ /* object properties */ }
]
}| Section | Purpose | Import Behavior |
|---|---|---|
ObjectIdentification | TableType and source solution | Ignored - TableType inferred from filename |
ExportMetadata | Audit trail for export | Ignored - metadata only |
Data | Array of configuration objects | Processed - actual data |
Note: The Data section is always an array, even for single-object exports.
The following fields are excluded from export to reduce file size and improve readability:
Auto-Generated Fields:
| Field | Reason |
|---|---|
ID | Auto-assigned unique identifier |
XRefInfo | Cross-reference data rebuilt by system |
LockState | Lock status reset on import |
LockOwner | Lock owner reset on import |
Compiled/Binary Data:
| Field | Reason |
|---|---|
ContentsRun | Compiled binary (.NET assembly) |
WebContentsRun | Web/WASM compiled version |
BuildMessages | Serialized build error data |
WebBuildMessages | Web build errors |
Build Results:
| Field | Reason |
|---|---|
BuildStatus | Build result, not configuration |
BuildErrors | Build error count |
BuildMessage | Build error text |
BuildRequired | Build flag |
BuildNumber | Build identifier |
Calculated Fields:
| Field | Reason |
|---|---|
Lines | Calculated from Contents |
Length | Calculated from Contents |
CanBePortable | Calculated property |
Strings | Extracted strings |
DriverVersion | System-assigned |
Conditional Filtering:
| Field | Rule |
|---|---|
Type | Kept only for UnsTags and UserType tables |
Note: Fields with empty or null values that represent configurable options (such as Description, Trigger, NamespaceDeclarations) are kept in the export for discoverability.
Individual Object Files ({TableType}-{Name}.json):
Bulk Table Files ({TableType}.json):
The import function uses the same JSON format as export.
| Scenario | Behavior |
|---|---|
| New object (Name doesn't exist) | Created with specified properties |
| Existing object (Name matches) | Skipped - no update, no error |
| Pre-defined system object | Skipped - cannot modify |
| Missing required field | Error - import fails for that object |
| Invalid reference | Error - referenced object must exist |
| Import file older than system object | Warning logged, object skipped |
Import uses DateModified to detect potential conflicts:
When importing related objects, order matters:
Valid TableType values:
| TableType | Object | Module |
|---|---|---|
UnsTags | Tag | UNS |
UnsUserTypes | UserType | UNS |
UnsEnumerations | Enumeration | UNS |
UnsTagProviders | TagProvider | UNS |
UnsAssetTree | AssetFolder | UNS |
DevicesChannels | Channel | Devices |
DevicesNodes | Node | Devices |
DevicesPoints | Point | Devices |
AlarmsGroups | AlarmGroup | Alarms |
AlarmsItems | AlarmItem | Alarms |
AlarmsAreas | AlarmArea | Alarms |
HistorianStorageLocations | StorageLocation | Historian |
HistorianTables | HistorianTable | Historian |
HistorianTags | HistorianTag | Historian |
DatasetsDBs | DatasetDB | Datasets |
DatasetsQueries | DatasetQuery | Datasets |
DatasetsTables | DatasetTable | Datasets |
ScriptsTasks | ScriptTask | Scripts |
ScriptsClasses | ScriptClass | Scripts |
ScriptsExpressions | ScriptExpression | Scripts |
SecurityUsers | SecurityUser | Security |
SecurityPermissions | SecurityPermission | Security |
When JSON fields reference other objects, use these formats:
| Reference To | Format | Example |
|---|---|---|
| Tag (root) | Tag.{name} | "Tag.Temperature" |
| Tag (nested) | Tag.{path}.{name} | "Tag.Line1.Tank1.Level" |
| Channel | Device.Channel.{name} | "Device.Channel.ModbusPLC1" |
| Node | Device.Node.{name} | "Device.Node.PLC1" |
| AccessType | Device.AccessType.{name} | "Device.AccessType.Read" |
| AlarmGroup | Alarm.Group.{name} | "Alarm.Group.Critical" |
| AlarmArea | Alarm.Area.{name} | "Alarm.Area.Plant1" |
| HistorianTable | Historian.Table.{name} | "Historian.Table.Table1" |
| DatasetDB | DB.{name} | "Dataset.DB.TagHistorian" |
| Data Type | Handling | Storage |
|---|---|---|
| Passwords | Vault references | Secure storage |
| Connection Strings | Environment placeholders | ${DB_CONNECTION} |
| API Keys | Vault references | Secure storage |
| Encrypted Values and Secrets | Not exported | Database only |
json
{
"DatabaseConnection": "${DB_CONNECTION}",
"EmailServer": "${SMTP_SERVER}",
"HistorianPath": "${HISTORIAN_PATH}"
}Variables resolved at runtime for environment-specific deployment.
bash
cd /path/to/solution
git init
git remote add origin https://github.com/company/scada-config.gitbash
git checkout -b feature/new-alarm-logic
# Make changes in FrameworX
git add .
git commit -m "Add temperature monitoring for Reactor-3"
git push origin feature/new-alarm-logicMain Branches:
Feature Branches:
Maintenance Branches:
Branch Hierarchy:
| Good | Bad |
|---|---|
| "Add temperature monitoring for Reactor-3" | "Updated stuff" |
| "Fix alarm delay calculation in Tank-Level" | "Changes" |
| "Implement new batch report template" | "Friday work" |
| Configuration Size | Export Time | File Count | Total Size |
|---|---|---|---|
| Small (<100 objects) | <1 sec | 20-50 | <500 KB |
| Medium (1,000 objects) | 2-4 sec | 50-150 | 2-5 MB |
| Large (10,000 objects) | 10-15 sec | 200-500 | 20-50 MB |
| Enterprise (50,000+) | 30-60 sec | 1,000+ | 100-300 MB |
Note: File counts and sizes reduced compared to previous format due to field filtering and flat structure.
(No change)
yaml
name: Validate FrameworX Configuration
on:
pull_request:
branches: [ main, develop ]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Validate JSON Schema
run: |
for file in $(find . -name "*.json"); do
python validate_schema.py $file
done
- name: Check Tag Naming Convention
run: python check_naming.py ./UnsTags.json
- name: Verify No Credentials
run: |
! grep -r "password\|credential\|secret" --include="*.json"Note: CI/CD scripts simplified due to flat directory structure - no need to traverse nested folders.
| Issue | Cause | Solution |
|---|---|---|
| Export not triggering | Automatic export disabled | Enable in settings |
| Large file sizes | Many objects | Use selective export |
| Merge conflicts | Concurrent edits | Use branches |
| Missing exports | Permission issues | Check directory access |
| Sensitive data exposed | Wrong configuration | Review export filters |
| Import skips object | Object already exists | Expected behavior (check logs) |
| Import error on reference | Referenced object missing | Import dependencies first |
| DateModified warning | System has newer version | Review changes before force import |