         // create variant groups of the base localisation first
         var baseLocalisationVariantGroups: [PBXVariantGroup] = []
 
+        let sourceExcludeFilePaths: Set<Path> = Set(
+            getSourceExcludes(targetSource: targetSource)
+        )
+
+        func isNotExcludeFilePath(_ path: Path) -> Bool {
+            return !path.lastComponent.contains(".DS_Store")
+                && !sourceExcludeFilePaths.contains(path)
+        }
+
         if let baseLocalisedDirectory = baseLocalisedDirectory {
-            for filePath in try baseLocalisedDirectory.children().sorted() {
+            for filePath in try baseLocalisedDirectory.children()
+                .filter(isNotExcludeFilePath(_:))
+                .sorted() {
                 let variantGroup = getVariantGroup(path: filePath, inPath: path)
                 groupChildren.append(variantGroup.reference)
                 baseLocalisationVariantGroups.append(variantGroup.object)

    }

    private func getGroupSources(targetSource: TargetSource, path: Path, isBaseGroup: Bool)
        throws -> (sourceFiles: [SourceFile], groups: [ObjectReference<PBXGroup>]) {

        let children = try getSourceChildren(targetSource: targetSource, dirPath: path)


        return variantGroup
    }

    func getSourceExcludes(targetSource: TargetSource) -> [Path] {
        let rootSourcePath = spec.basePath + targetSource.path

        return targetSource.excludes.map {
            Path.glob("\(rootSourcePath)/\($0)")
                .map {
                    guard $0.isDirectory else {
                        return [$0]
                    }

                    return (try? $0.recursiveChildren().filter { $0.isFile }) ?? []
                }
                .reduce([], +)
            }
            .reduce([], +)
    }

    private func getSourceChildren(targetSource: TargetSource, dirPath: Path) throws -> [Path] {

        /*
         Exclude following if mentioned in TargetSource.excludes.
