{"record":{"id":"a9407a4bbb3015a4","repo":"GoogleContainerTools/skaffold","slug":"can-t-merge-defaultnamespace-property-from-kustomi","errorCode":null,"errorMessage":"can't merge defaultNamespace property from kustomize into kubectl deployer, property is already set with different value","messagePattern":"can't merge defaultNamespace property from kustomize into kubectl deployer, property is already set with different value","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/schema/v2beta29/upgrade.go","lineNumber":327,"sourceCode":"\t\t\t}\n\t\t\tif strings.Contains(old.Path, \"/deploy/kpt\") {\n\t\t\t\tlog.Entry(context.TODO()).Warn(\"skip migrating kpt deploy sections. Please migrate these over manually\")\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc mergeKustomizeIntoKubectlDeployer(newPL *next.Pipeline, oldPL *Pipeline) error {\n\tkustomizeD := &next.KubectlDeploy{}\n\tpkgutil.CloneThroughJSON(oldPL.Deploy.KustomizeDeploy, kustomizeD)\n\n\tif newPL.Deploy.KubectlDeploy == nil {\n\t\tnewPL.Deploy.KubectlDeploy = kustomizeD\n\t} else {\n\t\tkubectlD := newPL.Deploy.KubectlDeploy\n\n\t\tif kubectlD.DefaultNamespace != nil && kustomizeD.DefaultNamespace != nil && *(kubectlD.DefaultNamespace) != *(kustomizeD.DefaultNamespace) {\n\t\t\treturn errors.New(\"can't merge defaultNamespace property from kustomize into kubectl deployer, property is already set with different value\")\n\t\t}\n\n\t\tif kubectlD.Flags.DisableValidation != kustomizeD.Flags.DisableValidation {\n\t\t\treturn errors.New(\"can't merge disableValidation property from kustomize into kubectl deployer, property is already set with different value\")\n\t\t}\n\n\t\tif kustomizeD.DefaultNamespace != nil {\n\t\t\tkubectlD.DefaultNamespace = kustomizeD.DefaultNamespace\n\t\t}\n\n\t\tkubectlD.Flags = next.KubectlFlags{\n\t\t\tDisableValidation: kustomizeD.Flags.DisableValidation,\n\t\t\tGlobal:            append(kubectlD.Flags.Global, kustomizeD.Flags.Global...),\n\t\t\tApply:             append(kubectlD.Flags.Apply, kustomizeD.Flags.Apply...),\n\t\t\tDelete:            append(kubectlD.Flags.Delete, kustomizeD.Flags.Delete...),\n\t\t}\n\n\t\tkubectlD.LifecycleHooks = next.DeployHooks{","sourceCodeStart":309,"sourceCodeEnd":345,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/schema/v2beta29/upgrade.go#L309-L345","documentation":"Older schemas allowed both a kustomize and a kubectl deployer; upgrades merge kustomize settings into the kubectl deployer. If both define defaultNamespace with different values, the merge is ambiguous and the upgrade fails with this error rather than silently picking one.","triggerScenarios":"Upgrading a config where deploy.kubectl.defaultNamespace and deploy.kustomize.defaultNamespace are both set and differ; mergeKustomizeIntoKubectlDeployer runs from upgradeOnePipeline.","commonSituations":"skaffold.yaml with kustomize deployer overriding the namespace while a kubectl deployer is also present; running `skaffold fix` on such multi-deployer configs.","solutions":["Make the defaultNamespace values identical in deploy.kubectl and deploy.kustomize before upgrading.","Remove the defaultNamespace from one of the two deployers (usually kustomize) so only one value remains.","Let the upgrade merge (drop conflicts), then re-add the desired defaultNamespace to the upgraded kubectl deployer."],"exampleFix":"# before\ndeploy:\n  kubectl:\n    defaultNamespace: foo\n  kustomize:\n    defaultNamespace: bar\n# after\ndeploy:\n  kubectl:\n    defaultNamespace: foo","handlingStrategy":"validation","validationCode":"func nsConflict(k, ku *v2beta29.KubectlDeploy) bool {\n    return k != nil && ku != nil && k.DefaultNamespace != nil && ku.DefaultNamespace != nil && *k.DefaultNamespace != *ku.DefaultNamespace\n}","typeGuard":"if kd.DefaultNamespace != nil && kzd.DefaultNamespace != nil && *kd.DefaultNamespace != *kzd.DefaultNamespace { /* conflict */ }","tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"can't merge defaultNamespace\") {\n    // unify or drop one defaultNamespace and retry\n}","preventionTips":["Keep defaultNamespace on only one deployer","Make kubectl/kustomize deployer settings consistent before upgrade","Prefer a single deployer in configs"],"tags":["kustomize","kubectl","schema-upgrade","conflict"],"backgroundTag":"config-merge-conflict","analyzedSha":"a1189de023efc32d4b8e11f395acc678aa555011","analyzedAt":"2026-09-05T12:09:27.064Z","contentChangedAt":"2026-09-05T12:09:27.064Z","schemaVersion":2},"datasetVersion":"2026-09-12T17:17:11.597Z"}