← 목록

How TDS Classic Decides What to Deploy, Update, and Delete

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.

The three dimensions

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.

1. Item Deployment

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:

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.

2. Child Item Synchronization (CIS)

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.

3. Recursive Deploy Action (RDA)

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:

RDA never modifies or overwrites items. Item updates are governed entirely by Item Deployment.

4. How they combine

Two tables make the interactions explicit. The first covers the item itself. The second covers strays under it.

Item itself (Item Deployment alone)

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

Stray descendants (CIS x RDA)

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

Full cross-check (Item Deployment x CIS x RDA)

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.

5. What about the web database?

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:

  1. Enable the "Publish After Deploy" post-deploy step on the Deploy tab of the TDS project. It uses Sitecore's standard Publishing Manager, so it also works with the Sitecore Publishing Service if installed. A smart publish from master to web will remove items from web that no longer exist in master.
  2. Publish manually or via your release pipeline after the TDS deploy completes.

Caveats:

6. The multi-project / bundle case

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:

7. Cross-cutting gotchas

A consolidated list, from things that bite people in practice.

8. Validators worth enabling

Turn these on for every CI build configuration. They are the only thing standing between a careless commit and an automated content massacre:

9. Defaults that hold up

These are conservative starting points. Tune for your project, but never the other direction.

TL;DR

References

Multi-project bundle merge behavior is undocumented at the time of writing.