devto 2026-07-24 원문 보기 ↗
TDS Classic exposes three deployment-related settings that, together, decide what every item in a TDS project looks like in the target Sitecore database after a deploy. Most teams set them once during project setup and then get bitten years later when a deploy unexpectedly recycles half the templates tree, or a "deletion" never reaches the web database. This post walks through what each setting actually does, how they interact, what happens with the master and web databases, and the combinations to watch.
Scope: TDS Classic 6.x on Sitecore 10.x. Behavior described here also applies to late TDS 5.x.
| Dimension | Scope | What it controls |
|---|---|---|
| Item Deployment | Per item | Whether the item itself is created, overwritten, or skipped |
| Child Item Synchronization (CIS) | Per item | Whether TDS treats descendants of the item as TDS-managed |
| Recursive Deploy Action (RDA) | Per project build configuration | What TDS does with descendants in Sitecore that are not in the project |
They operate on different axes. Item Deployment governs the item itself. CIS plus RDA govern strays (items in Sitecore but not in the project). They never overlap.
Item Deployment is a per-item property that controls how TDS treats the item itself during a deployment. It does not affect siblings or descendants, only the deserialization of this specific item into the target database. The property is set in the item's Visual Studio Properties window, or in bulk via the right-click Deployment Property Manager. The value is captured in the per-deploy DeployedItems.xml manifest that the TDS post-deploy processor reads at install time. Field-Level Deployment is an override on top of Item Deployment, allowing specific fields (e.g. __Renderings, __Security) to be force-deployed even on DeployOnce items.
Options:
/sitecore/templates and /sitecore/media library roots. Available since TDS Classic 5.8 (March 2019).Note: Sitecore's package installer force-overwrites __Standard Values items regardless of the TDS setting. Surface this with the Prevent Deploy Once Standard Values validator.
CIS is a per-item property that scopes which descendants TDS considers part of this project's responsibility. It does two distinct jobs: during the Sync Window it controls how deep the bidirectional comparison walks, and during deployment it controls whether the post-deploy processor walks this item's children in the target database to look for strays. CIS is the gate for RDA: if CIS is None on a parent, no pruning occurs under that parent regardless of the RDA value. CIS is evaluated per item by the post-deploy step, it is not inherited at runtime.
Options:
CIS values do not need to match across a chain. A KeepDirect parent with a KeepDirect child effectively covers two levels because each item's walk runs independently. Conversely, dropping CIS to None anywhere in the chain shields the subtree below that point from pruning.
RDA is a project-level setting on the Build tab of the TDS project's Property Pages, configured per build configuration (Debug, Release, QA, Production, etc.). It controls what the post-deploy processor does with stray items it finds in the target Sitecore database under any item whose CIS is KeepDirect or KeepAll. The setting is written into DeployedItems.xml at package generation time, so the action that runs at install is the one set when the package was built, not the one currently configured in the project. RDA is executed by HedgehogDevelopment.SitecoreProject.PackageInstallPostProcessor.dll during install of an .update or WebDeploy package, or by the TDS Sitecore Connector during a desktop deploy. RDA does not run during Quick Push or Sync.
Options:
/sitecore/Recycle Bin. The vendor's recommended value when RDA is enabled.RDA never modifies or overwrites items. Item updates are governed entirely by Item Deployment.
Two tables make the interactions explicit. The first covers the item itself. The second covers strays under it.
| Item Deployment | Target has the item | Target missing the item |
|---|---|---|
| Once | Skip, no overwrite | Create |
| Always | Overwrite all serialized fields | Create |
| Never (Placeholder) | Untouched, not in manifest | Not created |
The parent item's Item Deployment value is irrelevant here. What matters is the parent's CIS and the project's RDA.
| Parent CIS \ RDA | Ignore | Delete | Recycle |
|---|---|---|---|
| None | Untouched | Untouched | Untouched |
| KeepDirect | Untouched | Direct children hard-deleted | Direct children recycled |
| KeepAll | Untouched | All descendants hard-deleted | All descendants recycled |
| Item Deployment | Parent CIS | RDA = Ignore | RDA = Delete | RDA = Recycle |
|---|---|---|---|---|
| Once | None | Create if missing. Children untouched. | Same. Children untouched. | Same. Children untouched. |
| Once | KeepDirect | Create if missing. Direct strays untouched. | Create if missing. Direct strays HARD-DELETED. | Create if missing. Direct strays recycled. |
| Once | KeepAll | Create if missing. Descendant strays untouched. | Create if missing. ALL descendant strays HARD-DELETED. | Create if missing. ALL descendant strays recycled. |
| Always | None | Create or overwrite. Children untouched. | Same. Children untouched. | Same. Children untouched. |
| Always | KeepDirect | Create or overwrite. Direct strays untouched. | Create or overwrite. Direct strays HARD-DELETED. | Create or overwrite. Direct strays recycled. |
| Always | KeepAll | Create or overwrite. Descendant strays untouched. | Create or overwrite. ALL descendant strays HARD-DELETED. | Create or overwrite. ALL descendant strays recycled. |
| Never (Placeholder) | None | Not in manifest. Children untouched. | Same. | Same. |
| Never (Placeholder) | KeepDirect | Not in manifest. Post-step never visits it. CIS is dead. Children untouched. | Same. CIS on Placeholder is dead. Children untouched. | Same. Children untouched. |
| Never (Placeholder) | KeepAll | Same. CIS is dead. Children untouched. | Same. CIS on Placeholder is dead. Children untouched. | Same. Children untouched. |
The Placeholder rows matter: setting CIS on a Placeholder item buys nothing because the item is not in the manifest and the post-deploy processor never visits it.
RDA only touches the database the TDS project targets, as configured on the General property page. That is normally master. The deletion or recycle does not reach web.
To get the deletion reflected in web, you publish. Two paths:
master to web will remove items from web that no longer exist in master.Caveats:
master. After publish, web is updated either way. With Recycle, the item lives in the Archive database and can be restored.What happens when the same Sitecore item is added to more than one TDS project with different CIS values? This is worth covering because it is the easiest way to create silent mutual destruction.
For independent sequential deploys (one .update or WebDeploy package per TDS project, installed one after the other), there is no merge. Each install runs its own post-deploy pass with its own manifest. If Project A has KAS + Recycle on item X and Project B has None on item X, Project A's install will recycle anything under X that is not in A's manifest, including items B owns. Then B's install creates them again, but the churn is real and order-dependent. There is no project-level "precedence", only execution order, and order can shift in CI.
For Package Bundling (one TDS project references others via Multi-Project Properties / Package Bundling), the bundling project produces a single combined package. Items from referenced projects are pulled into a single DeployedItems.xml at build time. I could not find documentation describing what TDS does when the same item ID appears in two referenced projects with different CIS values. Plausible behaviors are build error, last-write-wins, or first-write-wins. Anyone telling you with confidence without pointing at TDS source code or a vendor document is guessing. Verify by inspecting the bundled manifest before relying on it.
The fix in either case is structural, not configuration tuning:
Feature.Foo.Items owns /sitecore/templates/Feature/Foo exclusively, with KAS only on Foo's root. No other project serializes anything under /sitecore/templates/Feature/Foo./sitecore/templates/Feature, mark them Placeholder in every project and place CIS on the leaf-most ancestor each project actually owns..item files across the solution's TDS projects and fails the build on duplicate IDs. TDS does not close this gap for you.A consolidated list, from things that bite people in practice.
RecursiveDeployAction attribute in DeployedItems.xml of the actual artifact being installed, not the current solution.IsDesktopBuild=false is not passed to MSBuild on the build server, items are packaged but not directly deployed. RDA is still in the manifest, so it activates wherever the package is later installed. This is the most common cause of "tested fine on Dev, deleted half my content on QA"..update packages. The post-deploy processor is faster and more reliable in the TDS WebDeploy installer than in legacy .update packages. WebDeploy is the right default on modern Sitecore.Turn these on for every CI build configuration. They are the only thing standing between a careless commit and an automated content massacre:
/sitecore/content, /sitecore/media library, and any other editor-owned subtrees. Prevents accidentally setting CIS on editor-owned trees.These are conservative starting points. Tune for your project, but never the other direction.
/sitecore/content or /sitecore/media library.master. The web database changes only after a publish; use Publish After Deploy or publish in your pipeline.Multi-project bundle merge behavior is undocumented at the time of writing.